2012-12-31 8 views
5

可能性の重複:
dismissModalViewController AND pass data back親ビューコントローラに値を渡すにはどうすればいいですか?

私は、IOSの開発に新たなんだと、この問題に引っかかっ:

私はストーリーボードを使用してナビゲーションコントローラ、vcAを持っています、 TableViewMutableArray(同じクラスのviewdidloadで初期化されています)からのデータを示しています。いずれかのセルを選択すると、第2のビューコントローラvcBが表示され、TextFieldと「リストに追加」ボタンが表示されます。

TextFieldにテキストを入力して「リストに追加」ボタンを押すと、前のビューの配列にテキストが追加されます(これはTableViewに表示されます)。 vcBのナビゲーションバーの「戻る」ボタンvcAには、新しいエントリが追加されたTableViewがリストの最上部に表示されます。基本的には、vcBTextFieldのテキストをvcAの配列に追加し、BACKボタンをクリックした後に新しい配列を表示したいとします。

私はこの問題について多くのことを検索しましたが、デリゲートとプロトコルが望ましい結果を達成する方法だが、委任の理解に問題があることがわかりました。

+2

[何を試しましたか?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Foggzie

+2

これは数えきれないほど多くの時間を要しています。 http://stackoverflow.com/a/6204427/1271826 – Rob

答えて

13

私は、この例では、モーダルとして自身を提示する第2のビューコントローラを有する:

第2のビューコントローラHファイルで:

@protocol SecondViewControllerDelegate <NSObject> 
- (void)addItemViewController:(id)controller didFinishEnteringItem:(NSString *)item; 
@end 

@interface SecondPageViewController : UIViewController <UITextViewDelegate> 
{ 
    NSString *previouslyTypedInformation; 
} 

@property (weak, nonatomic) IBOutlet UITextView *textView; 
@property (nonatomic) NSString *previouslyTypedInformation; 
@property (nonatomic, weak) id <SecondViewControllerDelegate> delegate; 

第2のビューコントローラMファイルでプロパティを合成することを確認し、およびデリゲートとして設定された第1のビューコントローラhのファイルに次に

- (IBAction)done:(id)sender 
{ 
    NSString *itemToPassBack = self.textView.text; 
    NSLog(@"returning: %@",itemToPassBack); 
    [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; 
    //dismiss modal view controller here 
} 

:これを追加

最初のビューコントローラのMファイルのsynthesizeで次に
@interface FirstPageViewController: UIViewController <SecondViewControllerDelegate> 
@property (nonatomic) NSString *returnedItem; 

とメソッドを追加:

- (void)addItemViewController:(SecondPageViewController *)controller didFinishEnteringItem: (NSString *)item 
{ 
    //using delegate method, get data back from second page view controller and set it to property declared in here 
    NSLog(@"This was returned from secondPageViewController: %@",item); 
    self.returnedItem=item; 

    //add item to array here and call reload 
} 

を今、あなたは返されたかのテキストを持っています!最初のビューコントローラのviewDidLoadで配列に文字列を追加し、

[self.tableView reloadData]; 

と呼び出すことができます。

+1

最初のビューコントローラで2番目のビューコントローラを初期化するだけで、次のように追加できます。 secondView.myDelegate = self; – hyd00

+0

gg13、ありがとうございます!あなたの答えの質問は「簡単に代理人を作る方法」と呼ばれるべきです。私はそれについて混乱しているように感じられましたが、今はそれを探していなくても、私はそれらを理解しています。 –

+0

ありがとうございました...非常に.. –

関連する問題