具有多个子视图问题的容器视图

Container View with multiple child views issue

我正在尝试开发一个 Table 视图控制器(具有导航控制器),其中行连接到多个视图控制器(TextField、TextView、TableView、DatePicker、ImageView 等。 ).

所以我这样设计,如果我点击任何一行,它应该打开一个 UIViewController having container view 然后将适当的控制器放在 container.All 相同类型的表视图行使用相同的视图控制器作为容器的子视图。

我能够放置适当的 view controller(例如 - 1.TextViewController 用于文本视图 2. Table Table 视图的视图控制器 3. 日期选择器的 DatePickerController。)在容器中取决于它们的行类型。

但是当我单击 done button(第二个屏幕右上角)时,我对如何从子视图中选取数据感到有点困惑。即对于子文本字段,无论我在输入框中键入什么,我都必须选择输入数据。对于子 Table 视图,我隐藏了完成按钮,因此一旦用户 select 数据 'cellForRowAtIndexPath' 应该触发并传递选择的数据。

如何处理数据?在哪里写? 还有其他设计方法吗?

正如@Suhail 提到的最好的方法,一般来说,当你想将数据从 child 视图控制器传递到 parent 视图控制器时,或者在某些情况下从以前显示的控制器(仍在堆栈中)的控制器,是通过使用 delegate 模式。您可以使用 iOS 协议或块来实现委托模式。在我看来,这两种方法各有利弊,对于该主题,您只需多做一些 google 搜索,因为这里不是讨论它的地方。

让我们为您的案例定义一些案例(不是所有案例):

  1. 您想将数据从 ChildTableViewControler 发送到 Field 控制器(屏幕 3 到屏幕 2)

    在这种情况下,据我了解,两个控制器都嵌入在一个 parent 控制器中,因此您必须将 parent 设置为两个 child 的委托] 控制器。您必须根据要发送给控制器的操作或数据创建一个或两个协议。在每个 children 上创建一个名为 delegate 的 属性(您可以选择自己的名字),在 parent 视图控制器上实现方法,每当您添加其中一个时children 在屏幕上,将 delegate 属性 设置为 parent 视图控制器。现在,无论何时你想向另一个 child 发送数据,你都必须调用协议中声明的方法。请记住,您可以通过 childViewControllers 属性.

    从 parent 访问 children

    简短版本:One/Two children 协议,parent 实施协议并响应 child 操作。

  2. 您想将数据从 Filed 发送到 TableViewController(从屏幕 2 到屏幕 1)

    在这种情况下,您将在 parent 视图控制器中声明一个协议,该协议将由 TableViewController 实现。声明一个 delegate(或您喜欢的任何名称) 属性 在 parent 视图控制器中。当您在屏幕上添加 Filed 控制器时,您将 delegate 属性 设置为 TableViewController。现在您可以通过 delegate 属性.

    Field 控制器与 TableViewController 通信

    简短版本:parent 视图控制器中的一个协议,TableViewController 实现协议并响应 TableViewController 操作。

  3. 您想将数据从 ChildTableViewController 发送到 TableViewController(屏幕 3 到屏幕 1)。 这与案例2相同。

当我从视图控制器发送数据时,我的规则之一是这样的:如果我想向前发送数据(到将要显示的下一个屏幕),那么我使用 property/methods。如果我想向后发送数据(到之前显示的控制器),那么我使用 delegate/blocks。

我最后的建议是,在开始实施上述解决方案之一之前,请检查 delegate/blocks 实施以及如何使用它们。如果实施错误,您可能会遇到很多麻烦,尤其是内存问题和随机崩溃。

有点跑题了,如果我的回答reader是9gagger那么"sorry for the long post, here's a potato"