替换详细视图控制器不会导致调用viewWillAppear

时间:2010-06-30 12:26:11

标签: uisplitviewcontroller ipad

我正在将我的iPhone应用程序移植到iPad。在iPhone上我选择表格中的行,然后将下一个视图控制器推到navigationController的顶部(现在导航在拆分视图控制器的左侧部分执行)。对于iPad,我用这种方式修改了代码:

if (deviceIsIPad())
{
    UISplitViewController *svc = (UISplitViewController *)[self findNearestParentOfClass:[UISplitViewController class]];
    svc.viewControllers = [NSArray arrayWithObjects:[svc.viewControllers objectAtIndex:0],
                                                     nextViewController,
                                                     nil];
}
else
    [self.navigationController pushViewController:nextViewController animated:YES];

iPhone代码没有问题(当控制器被推送到导航控制器时),但是在iPad上viewWillAppear:没有调用(但是调用了viewDidLoad),而我有理由在viewWillAppear中执行一些自定义:为什么不调用它,我该怎么做才能强制它被调用?

提前多多谢谢!

1 个答案:

答案 0 :(得分:0)

不完全确定您在此处尝试做什么,只是初始化splitview控制器并向其添加控制器不会强制显示视图。您必须将splitview控制器的视图添加到窗口。

以下是Xcode Splitview模板的应用代表applicationDidFinishLaunching:

中的代码
splitViewController = [[UISplitViewController alloc] init];
splitViewController.viewControllers = [NSArray arrayWithObjects:navigationController, detailViewController, nil];
splitViewController.delegate = detailViewController;

NSLog(@"master=%@",splitViewController.viewControllers);
// Add the split view controller's view to the window and display.
[window addSubview:splitViewController.view];
[window makeKeyAndVisible];

导航控制器中的视图显示是因为它已附加到窗口并显示其受控控制器之一的视图。

编辑:

来自评论:

  

您引用的所有初始化代码   这里已经完成了。现在,我们来吧   假设左边有一张桌子   控制器,然后他选择另一行   那里,想要替换正确   控制器与另一个。   splitViewController.view已添加   窗口фдкуфвн,因为有些GUI   在viewDidLoad中初始化的元素,   在视图中正确显示

听起来你的问题就出现了,因为splitview控制器的细节(右侧)视图总是可见的,即它只出现,即在第一次加载后立即调用viewWillAppear。细节方面没有任何观点存在。我不确定完全交换splitview的viewControllers会做什么。

如果您想动态更改详细视图。您需要在右侧放置导航控制器,然后在该导航器中推送和弹出视图控制器以响应右侧控制器中的事件。

了解iPad iPod应用程序的工作原理。您有播放列表的左侧视图,右侧是播放列表中所有歌曲的列表。选择一首歌曲会将歌曲详细信息视图推到歌曲列表的顶部。