2012-01-18 6 views
3

誰かがモーダルビューで変更を行った後、親ビューでUILabelを更新しようとしています。したがって、「保存」をクリックすると、新たに入力された値は親ビューコントローラに表示されるテキストを変更します。親ビューコントローラでUILabelを更新しようとしました。

しかし、私はUILabelに新しく入力された値をリフレッシュするようには思えません。

私は何を試すことができますか?私はいくつかのことを試しましたが、ビューが既にロードされているので、何も "リフレッシュ"されません。

ありがとうございます!

+0

I委任メソッドを作成します。 「保存」ボタンを押すと、モーダルが解除され、委譲メソッドが呼び出されます。親ビューには、この委譲メソッドが実装されています。呼び出されると、ラベルが更新されます。 – simonbs

答えて

8

これを実行する方法はたくさんあります。 1つの方法は、異なるクラス間で呼び出しを行うためにNSNotificationCenterを使用することです。だから、親ビューでは、更新を担当する機能を持つことになります(updateLabelそれを呼び出すことができます)とは、次の操作を行います:

:他のビューで今すぐ

- (void) updateLabel 
{ 
    yourLabel.text = @"what you need"; 
} 

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateLabel) name:@"DoUpdateLabel" object:nil]; 
} 

単に保存ボタンで通知を投稿

[[NSNotificationCenter defaultCenter] postNotificationName:@"DoUpdateLabel" object:nil userInfo:nil]; 

EDIT:いつものShを有することが好ましい。このシナリオでは

  1. :私はここに2つのことを言及する必要があり あなたのプログラムのどのビューでもこのデータにアクセスできるようにデータを保存するData Modalです。言い換えれば、クラスからデータを分離するのがよい習慣です。
  2. SWIFTで[[NSNotificationCenter defaultCenter] removeObserver:self];
+0

完全に作業し、非常にストレートです。ありがとう! – TheTC

+0

これはうれしいことですが、あなたは歓迎です:) – antf

3

私のコメントを詳しく説明します。これは、ラベルを更新するための委譲メソッドを実装する方法です。親ビューコントローラのヘッダで

#import "ModalViewController.h" 

@interface ViewController : UIViewController <ModalViewControllerDelegate> 

/* This presents the modal view controller */ 
- (IBAction)buttonModalPressed:(id)sender; 

@end 

と実装で:

ここ
/* Modal view controller did save */ 
- (void)modalViewControllerDidSave:(ModalViewController *)viewController withText:(NSString *)text 
{ 
    NSLog(@"Update label: %@", text); 
} 

/* Prepare for segue */ 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"modalSegue"]) 
    { 
     ModalViewController *mvc = (ModalViewController *) segue.destinationViewController; 
     mvc.delegate = self; 
    } 
} 

/* Present modal view */ 
- (IBAction)buttonModalPressed:(id)sender 
{ 
    [self performSegueWithIdentifier:@"modalSegue" sender:self]; 
} 

あなたがトップに委任方法を参照してください。

モーダルビューコントローラは、このような委任プロトコルを含むことになるのヘッダ:

@protocol ModalViewControllerDelegate; 

@interface ModalViewController : UIViewController 

@property (nonatomic, weak) id <ModalViewControllerDelegate> delegate; 

- (IBAction)buttonSavePressed:(id)sender; 

@end 

@protocol ModalViewControllerDelegate <NSObject> 
- (void)modalViewControllerDidSave:(ModalViewController *)viewController withText:(NSString *)text; 
@end 

モーダルビューコントローラはこれと同様の方法で含むことになるの実装:

/* Save button was pressed */ 
- (IBAction)buttonSavePressed:(id)sender 
{ 
    if ([self.delegate respondsToSelector:@selector(modalViewControllerDidSave:withText:)]) 
     [self.delegate modalViewControllerDidSave:self withText:@"Some text"]; 

    [self dismissModalViewControllerAnimated:YES]; 
} 

を保存ボタンが押され、デリゲートが通知され、テキストビューのテキストがデリゲーションメソッドによって送信されます。

+0

これは非常にしっかりしているようです。どうもありがとうございました。今、これをテストしようとしています。おかげさまで – TheTC

+0

ありがとうございます。詳細な説明については、[代理プロパティ]を弱参照にするなどの強力な提案があるので、[この回答](http://stackoverflow.com/a/6169104/426839)を参照してください。 –

+0

本当に、デリゲートは間違いなく弱いはずです。それは間違いだった。私は答えを更新しました。ありがとう。 – simonbs

1

を追加することによって、あなたは、メインビューで使用NSNotificationCenterをresomveすることを忘れないでください:

ParentViewController:オザービューで

func updateLabel() { 
     yourLabel.text! = "what you need" 
    } 

override func viewDidLoad() { 
     super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.updateLabel), name: "DoUpdateLabel", object: nil) 
} 

@IBAction func closePopUp(sender: AnyObject) { 

     NSNotificationCenter.defaultCenter().postNotificationName("DoUpdateLabel", object: nil, userInfo: nil) 
    } 
関連する問題