我有一个 detailView,上面有一个按钮,可以将 tableView 作为模式视图来帮助用户选择名称。我试图找出一种将所选名称传递给父detailView 上的textField 的简单方法。
我一直在使用 Storyboard 构建这个项目,但我完全被困在这一点上。
我有一个 detailView,上面有一个按钮,可以将 tableView 作为模式视图来帮助用户选择名称。我试图找出一种将所选名称传递给父detailView 上的textField 的简单方法。
我一直在使用 Storyboard 构建这个项目,但我完全被困在这一点上。
有几种方法可以解决此类问题:
共享对象:父视图控制器向子视图控制器提供一些对象,其中包含子视图期望使用并可能修改的状态。在这种情况下,它可能是一个字典,其中包含要显示的名称数组和所选人员的索引。
child 的 properties:通常,child view controller 本身就是共享对象。父级实例化子级,设置子级的一些属性(例如people
和selectedPerson
),并呈现它。selectedPerson
当孩子完成后,父母在释放它之前获得它关心的孩子的属性(例如)。
委托:有时子视图控制器需要与父视图控制器交互才能完成其工作。这是使用委托的好时机:建立一些孩子知道并且父母实现的协议,向孩子添加一个属性,并让父母在呈现之前将delegate
孩子的属性设置为自己。delegate
这样,孩子可以在不依赖父类的情况下与父母交谈。
对于您描述的情况,您只想在孩子完成后将一些数据传回给父母,上面的第二种策略是最简单的。
注意: DetailViewController
下面应该替换为您的详细视图控制器的任何类。
1) 如果您还没有 的子类UITableViewController
,请创建一个。这将允许您向表视图控制器添加属性。将 Storyboard 中模态呈现的控制器的类更改为这个新的子类。
2)像这样向表视图控制器子类添加一个属性:
@property (weak, nonatomic) id mydelegate;
3) 在prepareForSegue
您的 DetailViewController 中,设置mydelegate
目标视图控制器的属性,该属性self
是指向您的父 detailView 的指针。
4) 在您的 DetailViewController 中,创建一个接收所选名称的方法:
- (void)userDidSelectName:(NSString *)name;
5) 在tableView:didSelectRowAtIndexPath
您的 tableViewController 子类的方法中,从中获取名称tableViewCell
并调用userDidSelectName
委托上的方法:
[self.mydelegate userDidSelectName:selectedName];
6) 正确的方法是定义一个具有方法的协议,userDidSelectName
然后使步骤 2 中的委托指针需要一个实现该协议的类。更快更脏的做法是在第 2 步中将委托指针设为 typeDetailViewController *
而不是id
. 这将允许您在userDidSelectName
没有编译器抱怨的情况下调用。