如何将值传递给父视图控制器?
可能重复:
dismissModalViewController并传回数据
我是新来的ios开发,并坚持在这个问题上:
我正在使用故事板,并有一个导航控制器vcA
,其中有一个TableView
,它显示来自MutableArray
(在相同类的viewdidload
中初始化)的一些数据。 select任何单元格后,会显示第二个视图控制器vcB
,其中包含一个TextField
和一个名为“添加到列表”的button。
我想要的是,当我在TextField
input一些文本,然后按下“添加到列表”button,文本应该被添加到前一个视图的数组(显示在TableView
),当我点击“后退”button在vcB
的导航栏上, vcA
应该显示更新后的TableView
(列表顶部)。 基本上我想从vcB
的TextField
添加文本到vcB
的数组,并在点击返回button后显示新的数组。
我已经搜寻了很多关于这个问题,似乎发现委托和协议是达到预期的结果的方式,但我无法理解委托。
在这个例子中,我有第二个视图控制器呈现为模态:
在第二个视图控制器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;
在第二个视图控制器m文件确保合成属性并添加然后添加:
- (IBAction)done:(id)sender { NSString *itemToPassBack = self.textView.text; NSLog(@"returning: %@",itemToPassBack); [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; //dismiss modal view controller here }
然后在第一个视图控制器h文件将其设置为委托:
@interface FirstPageViewController: UIViewController <SecondViewControllerDelegate> @property (nonatomic) NSString *returnedItem;
然后在第一个视图控制器的m文件中合成并添加方法:
- (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 }
现在你已经有了什么回报的文字! 您可以将string添加到您的数组在第一个视图控制器的viewDidLoad和调用
[self.tableView reloadData];
它应该工作。