我有一个detailView,它上面有一个按钮,可以将tableView作为模态视图显示,以帮助用户选择名称。我试图想出一种简单的方法将所选名称传递给父detailView上的textField。
我一直在使用Storyboard构建这个项目,但我完全陷入困境。
答案 0 :(得分:2)
有几种方法可以解决这类问题:
共享对象:父视图控制器向子项提供一些对象,该对象包含子项应该使用并可能修改的状态。在这种情况下,它可能是一个字典,其中包含要显示的名称数组和所选人员的索引。
子属性:通常,子视图控制器本身就是共享对象。父实例化子项,设置一些子项的属性(例如people
和selectedPerson
),并呈现它。当孩子完成后,父母会在释放孩子之前获得其关心的孩子的属性(例如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
。