Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.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 切换视图时的iOS特定行为_Iphone_Objective C_Cocoa Touch_Viewwillappear - Fatal编程技术网

Iphone 切换视图时的iOS特定行为

Iphone 切换视图时的iOS特定行为,iphone,objective-c,cocoa-touch,viewwillappear,Iphone,Objective C,Cocoa Touch,Viewwillappear,我看到了一个与子视图方法调用相关的奇怪问题,它似乎是iOS版本特定的 我有两个带有父视图控制器的可交换视图,它们决定显示哪一个。基本上,有一个登录视图,当您登录时,该视图会切换到帐户视图,当您注销时,该视图会切换回登录 代码非常简单。以下是登录时调用的父视图控制器的示例方法: - (void) showAccountView:(BOOL)animated { if(self.accountController == nil) self.accountController

我看到了一个与子视图方法调用相关的奇怪问题,它似乎是iOS版本特定的

我有两个带有父视图控制器的可交换视图,它们决定显示哪一个。基本上,有一个登录视图,当您登录时,该视图会切换到帐户视图,当您注销时,该视图会切换回登录

代码非常简单。以下是登录时调用的父视图控制器的示例方法:

- (void) showAccountView:(BOOL)animated
{
    if(self.accountController == nil)
        self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];

    [self.loginController viewWillDisappear:animated];
    [self.accountController viewWillAppear:animated];

    [self.loginController.view removeFromSuperview];
    [self.view insertSubview:alertsController.view atIndex:0];

    [self.loginController viewDidDisappear:animated];
    [self.accountController viewDidAppear:animated];
}
还有一个与此类似的用于显示登录视图。很简单。我遇到的问题是,viewwillbeen、viewdidebeen、viewwilldefine、viewdidefine方法在iOS 4.3下调用了一次,但在iOS 5.0和5.1下调用了两次

例如,在所有iOS版本中,当父视图直接调用子视图时,子视图的viewwillbeen当然会被调用。但是,只有iOS 5.0和5.1在调用insertSubview期间第二次调用它

因此,如果我删除了除removeFromSuperview和insertSubview调用之外的所有内容,那么看起来如下所示:

- (void) showAccountView:(BOOL)animated
{
    if(self.accountController == nil)
        self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];

    [self.loginController.view removeFromSuperview];
    [self.view insertSubview:alertsController.view atIndex:0];
}
现在,在5.0和5.1中,子视图方法在insertSubview期间只被调用一次。但是,它在4.3下会导致一个问题,因为它们根本不会被调用

我读过几篇关于确保子视图方法被调用的文章,但我还没有看到任何行为依赖于iOS的类似文章

另外,我认为实现这一点的唯一方法是在运行时检查iOS版本,并直接为iOS 4.3调用子视图方法,而不是在5.0和5.1下调用它们


有什么想法吗?

除非iOS 5中添加了新的父/子视图控制器支持,否则不能将一个视图控制器的内容放在另一个视图控制器中。现在正式支持它的方法有很多,例如addChildViewController、从ViewController:toViewController:duration:options:animations:completion


如果您确实尝试在iOS 4或更早版本下将一个视图控制器的视图托管在另一个视图控制器中,那么您在这一过程中的每一步都在与操作系统作斗争。

首先,您不应该调用viewWill/Did。。。第二,你怎么知道他们没有被呼叫?我同意你的观点,我不应该给他们打电话,但显然我是这样做的,因为在4.3中他们没有被单独呼叫。我可以看出它们没有被调用,因为我设置的断点没有被命中。此外,从视图的功能性可以明显看出,它们没有被调用。事实上,我刚刚发现它讨论了一个与我在答案中看到的类似的问题。他们似乎认为这是iOS中的一个bug,并建议使用动态版本检查。我从一本iOS开发书籍中获得了这项技术,并不是说它是正确的。那么,在5.0之前的iOS版本中,什么才是实现这一目标的合适方法呢?@Duncan C我知道某些ViewController有一些限制,例如UISplitViewController必须是根。但是,将UITableViewController放在UISplitViewController中是很常见的。请您澄清您的观点,或向我们提供支持该观点的文件?谢谢,我的意思是,在iOS 5之前,您不应该将自定义视图控制器的一个内容放入另一个内容中。苹果的容器视图控制器导航控制器、选项卡栏控制器和iPad上的拆分视图控制器都是特殊的,设计用于包含其他视图控制器。iOS 5内置的父/子视图控制器方案允许您创建具有不同行为的容器视图控制器。我做了一些挖掘,在文档中找不到这样一条语句,即在iOS 5之前的版本中不应该有一个视图控制器的视图,但我已经看到了。