Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么将视图从一个视图控制器插入另一个视图控制器是不正确的?_Iphone_Objective C_Uiviewcontroller - Fatal编程技术网

Iphone 为什么将视图从一个视图控制器插入另一个视图控制器是不正确的?

Iphone 为什么将视图从一个视图控制器插入另一个视图控制器是不正确的?,iphone,objective-c,uiviewcontroller,Iphone,Objective C,Uiviewcontroller,在iPad应用程序中,我有一个包含多个视图控制器的选项卡控制器。其中一个视图控制器(称为MainViewController)需要两个并排的表视图 因此,我编写了两个UITableViewController子类,从MainViewController中,我分配/初始化UITableViewController的两个子类,并将每个子类中的tableview添加到MainViewController的视图中 这意味着UITableViewController子类的视图是MainViewContro

在iPad应用程序中,我有一个包含多个视图控制器的选项卡控制器。其中一个视图控制器(称为MainViewController)需要两个并排的表视图

因此,我编写了两个UITableViewController子类,从MainViewController中,我分配/初始化UITableViewController的两个子类,并将每个子类中的tableview添加到MainViewController的视图中

这意味着UITableViewController子类的视图是MainViewController视图的子视图

这个答案是:说这样做是不正确的,而且苹果似乎开始减少这种做法

我真的不想把两个UITableViewController中的所有代码都放在MainViewController中,因为如果我想单独在应用程序的其他地方使用其中一个tableview,这将使它更难阅读,并且将来可能会创建重复的代码


这真的是一个问题吗?如果是的话,我该怎么做呢?

苹果并没有减少这方面的开支。这是在iOS 5之前创建自定义容器视图控制器的唯一方法。苹果实际上听取了开发者的意见,并通过子视图和父视图控制器方法使iOS5中的这类工作变得更容易,更不用说他们让它分层工作了

在大多数情况下,就应用程序崩溃、性能或其他方面而言,这实际上不是一个问题。在某些情况下,这可能是一个问题,因为假设您有一个子视图控制器。将视图控制器的视图添加到根视图控制器。在iOS5之前,子视图控制器类似于导航控制器视图控制器、选项卡栏控制器视图控制器和模式视图控制器。当您有一个按钮调用
[self.parentViewController DismissModalviewController激活:是]?从技术上讲,视图控制器不是作为模式视图控制器显示的,而是将视图添加到根视图控制器视图中

在iOS5中,您可以将子视图控制器添加到视图控制器,并可以从一个子视图控制器转换到另一个子视图控制器


现在,即使您的视图控制器没有不同的父视图控制器,将“根”视图控制器添加到另一个根视图控制器也不是最好的方法(特别是因为除非在子视图控制器中显式创建parentViewController指针,否则无法访问父视图控制器)。因此,最终,苹果只是让它变得更简单、更解耦。

只要你负责管理viewController生命周期事件,就可以这么做

initWithNibName...
loadView:
viewDidLoad:...
.
.
viewDidUnload..
dealloc
memoryWarnings
orientation changes
因此,如果您创建一个自定义的“容器视图控制器”,那么您就有责任在适当的时间对子视图控制器调用所有这些方法。可以将其视为“如果您要实施UITabBarController,您将需要管理哪些与孩子有关的内容?”

它很快就会变得复杂。添加另一个viewController的视图作为子视图是孩子们的游戏


iOS 5通过指定父子关系为您做了一些这方面的工作,但是我仍然没有看到任何示例代码指向任何地方。

我要说,创建视图控制器容器并不是不正确或错误的,尤其是当苹果的工程师自己这样做的时候。uitabarcontroller、UINavigationController或UISplitViewController-它们都是视图控制器容器。许多具有独特用户体验的优秀应用程序都比你想象的更常见。然而,真正的问题是,很难用正确的方法来实现,因此,视图生命周期、内存管理和轮换处理等都是按照视图的层次结构正确完成的。幸运的是,苹果公司的员工在这方面做得不错d iOS5引入了许多关于控制器容器的功能:

如果您对在iOS5之前如何解决上述问题感兴趣,请阅读以下两篇非常好的博客文章:

从中观看控制器控制视频。