1

我正在将我的 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: 中执行一些自定义。为什么它不被调用,我应该怎么做才能强制它被调用?

非常感谢提前!

4

1 回答 1

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 被添加到窗口фдкуфвн,因为在viewDidLoad中初始化的一些GUI元素,正确地呈现在视图上

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

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

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

于 2010-06-30T13:14:04.247 回答