5

可能重复:
dismissModalViewController 并传回数据

我是 ios 开发的新手,并且遇到了这个问题:

我正在使用情节提要并有一个导航控制器,vcA其中有一个TableView显示来自 a 的一些数据(在同一类MutableArray中初始化)。viewdidload选择任何单元格后,将显示第二个视图控制器 ,vcB其中包含一个TextField和一个名为“添加到列表”的按钮。

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

我对这个问题进行了很多搜索,似乎发现委托和协议是实现预期结果的方法,但我在理解委托时遇到了麻烦。

4

1 回答 1

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;

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

现在你有了返回的文本!您可以在第一个视图控制器的 viewDidLoad 中将字符串添加到数组中并调用

[self.tableView reloadData]; 

它应该可以工作。

于 2012-12-31T21:52:17.457 回答