【问题标题】:How to pass a value to parent view controller? [duplicate]如何将值传递给父视图控制器? [复制]
【发布时间】:2012-12-15 21:11:45
【问题描述】:

可能重复:
dismissModalViewController AND pass data back

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

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

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

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

【问题讨论】:

标签: iphone objective-c ios xcode storyboard


【解决方案1】:

我有第二个视图控制器在这个例子中显示为模态:

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

它应该可以工作。

【讨论】:

  • 只是一个补充,在第一个视图控制器中初始化第二个视图控制器,执行:secondView.myDelegate = self;
  • gg13,谢谢!您回答的问题应称为“如何轻松创建代表”。我对此感到困惑,现在甚至没有搜索它,我理解它们。
  • 谢谢你……非常感谢……
  • itemToPassBack 正在工作,但是当我尝试将其传递给 FirstPageViewController 时,它并没有移动到 FirstPageViewController
猜你喜欢
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
相关资源
最近更新 更多