具有多个子视图问题的容器视图
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 搜索,因为这里不是讨论它的地方。
让我们为您的案例定义一些案例(不是所有案例):
您想将数据从 ChildTableViewControler
发送到 Field
控制器(屏幕 3 到屏幕 2)
在这种情况下,据我了解,两个控制器都嵌入在一个 parent 控制器中,因此您必须将 parent 设置为两个 child 的委托] 控制器。您必须根据要发送给控制器的操作或数据创建一个或两个协议。在每个 children 上创建一个名为 delegate
的 属性(您可以选择自己的名字),在 parent 视图控制器上实现方法,每当您添加其中一个时children 在屏幕上,将 delegate
属性 设置为 parent 视图控制器。现在,无论何时你想向另一个 child 发送数据,你都必须调用协议中声明的方法。请记住,您可以通过 childViewControllers
属性.
从 parent 访问 children
简短版本:One/Two children 协议,parent 实施协议并响应 child 操作。
您想将数据从 Filed
发送到 TableViewController
(从屏幕 2 到屏幕 1)
在这种情况下,您将在 parent 视图控制器中声明一个协议,该协议将由 TableViewController
实现。声明一个 delegate
(或您喜欢的任何名称) 属性 在 parent 视图控制器中。当您在屏幕上添加 Filed
控制器时,您将 delegate
属性 设置为 TableViewController
。现在您可以通过 delegate
属性.
从 Field
控制器与 TableViewController
通信
简短版本:parent 视图控制器中的一个协议,TableViewController
实现协议并响应 TableViewController
操作。
您想将数据从 ChildTableViewController
发送到 TableViewController
(屏幕 3 到屏幕 1)。
这与案例2相同。
当我从视图控制器发送数据时,我的规则之一是这样的:如果我想向前发送数据(到将要显示的下一个屏幕),那么我使用 property/methods。如果我想向后发送数据(到之前显示的控制器),那么我使用 delegate/blocks。
我最后的建议是,在开始实施上述解决方案之一之前,请检查 delegate
/blocks
实施以及如何使用它们。如果实施错误,您可能会遇到很多麻烦,尤其是内存问题和随机崩溃。
有点跑题了,如果我的回答reader是9gagger那么"sorry for the long post, here's a potato"
我正在尝试开发一个 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 搜索,因为这里不是讨论它的地方。
让我们为您的案例定义一些案例(不是所有案例):
您想将数据从
ChildTableViewControler
发送到Field
控制器(屏幕 3 到屏幕 2)在这种情况下,据我了解,两个控制器都嵌入在一个 parent 控制器中,因此您必须将 parent 设置为两个 child 的委托] 控制器。您必须根据要发送给控制器的操作或数据创建一个或两个协议。在每个 children 上创建一个名为
从 parent 访问 childrendelegate
的 属性(您可以选择自己的名字),在 parent 视图控制器上实现方法,每当您添加其中一个时children 在屏幕上,将delegate
属性 设置为 parent 视图控制器。现在,无论何时你想向另一个 child 发送数据,你都必须调用协议中声明的方法。请记住,您可以通过childViewControllers
属性.简短版本:One/Two children 协议,parent 实施协议并响应 child 操作。
您想将数据从
Filed
发送到TableViewController
(从屏幕 2 到屏幕 1)在这种情况下,您将在 parent 视图控制器中声明一个协议,该协议将由
从TableViewController
实现。声明一个delegate
(或您喜欢的任何名称) 属性 在 parent 视图控制器中。当您在屏幕上添加Filed
控制器时,您将delegate
属性 设置为TableViewController
。现在您可以通过delegate
属性.Field
控制器与TableViewController
通信简短版本:parent 视图控制器中的一个协议,
TableViewController
实现协议并响应TableViewController
操作。您想将数据从
ChildTableViewController
发送到TableViewController
(屏幕 3 到屏幕 1)。 这与案例2相同。
当我从视图控制器发送数据时,我的规则之一是这样的:如果我想向前发送数据(到将要显示的下一个屏幕),那么我使用 property/methods。如果我想向后发送数据(到之前显示的控制器),那么我使用 delegate/blocks。
我最后的建议是,在开始实施上述解决方案之一之前,请检查 delegate
/blocks
实施以及如何使用它们。如果实施错误,您可能会遇到很多麻烦,尤其是内存问题和随机崩溃。
有点跑题了,如果我的回答reader是9gagger那么"sorry for the long post, here's a potato"