2012-12-31 132 views
5

可能重复:
dismissModalViewController AND pass data back如何将值传递给父视图控制器?

我新的iOS开发并停留在这个问题:

我用故事板,并有导航控制器,vcA,其中显示TableView,其中显示来自MutableArray(其在相同类别的viewdidload中初始化)的一些数据。在选择任何单元格之后,第二个视图控制器vcB显示为其中包含TextField以及一个名为“添加到列表”的按钮。

我想要的是,当我在TextField中输入一些文本并按下“添加到列表”按钮时,文本应该被添加到前一个视图的数组中(在TableView中显示),当我点击vcB的导航栏上的“返回”按钮vcA应显示更新的TableView及其中的新条目(位于列表顶部)。基本上我想将vcBTextField中的文字添加到vcA的数组中,并在点击返回按钮后显示新的数组。

我已经搜索了很多关于这个问题,似乎发现委托和协议是达到预期结果的方式,但我无法理解委托。

+2

[你试过了什么?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Foggzie

+2

这个问题已经被问过太多次了。 http://stackoverflow.com/a/6204427/1271826 – Rob

回答

13

我在此示例中呈现本身作为模态的第二视图控制器:

在第二视图控制器.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; 

在第二视图控制器米文件确保合成属性和加然后添加这样的:在所述第一视图控制器.h文件

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

然后将其设置为代表:

@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 
} 

现在你有返回什么文字!您可以在第一视图控制器的viewDidLoad的字符串添加到您的阵列,并呼吁

[self.tableView reloadData]; 

,它应该工作。

+1

只是另外,你在第一个初始化你的第二个视图控制器,做: secondView.myDelegate = self; – hyd00

+0

gg13,谢谢!您的答案应该被称为“如何轻松创建代表”。我对此感到困惑,现在甚至没有找到它,我理解它们。 –

+0

非常感谢你... –

相关问题