将变量从模态tableview传递到父视图

时间:2013-04-26 16:05:52

标签: ios storyboard

我有一个detailView,它上面有一个按钮,可以将tableView作为模态视图显示,以帮助用户选择名称。我试图想出一种简单的方法将所选名称传递给父detailView上的textField。

我一直在使用Storyboard构建这个项目,但我完全陷入困境。

2 个答案:

答案 0 :(得分:2)

有几种方法可以解决这类问题:

  • 共享对象:父视图控制器向子项提供一些对象,该对象包含子项应该使用并可能修改的状态。在这种情况下,它可能是一个字典,其中包含要显示的名称数组和所选人员的索引。

  • 子属性:通常,子视图控制器本身就是共享对象。父实例化子项,设置一些子项的属性(例如peopleselectedPerson),并呈现它。当孩子完成后,父母会在释放孩子之前获得其关心的孩子的属性(例如selectedPerson)。

  • 委派:有时,子视图控制器需要与父级进行交互才能完成其工作。这是使用委托的好时机:建立一些孩子知道并且父实现的协议,向子节点添加delegate属性,并让父节点将子节点设置为delegate属性。提出它。这样,孩子可以在不依赖父类的情况下与父母交谈。

对于您描述的情况,您只想在孩子完成时将一些数据传回给父母,上面的第二个策略是最简单的。

答案 1 :(得分:1)

注意:下面的DetailViewController应该替换为详细视图控制器的类。

1)如果您还没有UITableViewController的子类,请创建一个。{1>这将允许您向表视图控制器添加属性。将故事板中模态呈现的控制器的类更改为此新子类。

2)向表视图控制器子类添加一个属性,如下所示:

@property (weak, nonatomic) id mydelegate;

3)在DetailViewController的prepareForSegue中,将目标视图控制器的mydelegate属性设置为self,这是指向父详细视图的指针。

4)在DetailViewController中,创建一个接收所选名称的方法:

- (void)userDidSelectName:(NSString *)name;

5)在tableViewController子类的tableView:didSelectRowAtIndexPath方法中,从tableViewCell获取名称并在委托上调用userDidSelectName方法:

[self.mydelegate userDidSelectName:selectedName];

6)正确的方法是定义一个方法userDidSelectName的协议,然后使步骤2中的委托指针需要一个实现该协议的类。更快更脏的事情是在DetailViewController *类型的步骤2中创建委托指针而不是id。这将允许您在没有编译器抱怨的情况下调用userDidSelectName