我有一个带有master和detail的splitvew控制器(在storyboard中设置),我在主viewController中将preferredDisplayMode设置为UISplitViewControllerDisplayModeAllVisible
。
我在主视图控制器上有这些方法:
- (void) viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
//This is called
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//This is not called
[self.searchController.searchBar sizeToFit];
[self configNavBar]; //Adds few buttons to the nav bar
}
我想知道为什么不在这里调用viewwillAppear
但是调用viewDidLoad,viewDidAppear。 viewWillAppear中的断点未命中。
如果我将首选显示模式设置为UISplitViewControllerDisplayModePrimaryOverlay
,则会调用viewWillAppear。
但是这里细节视图控制器不会占据半屏。
答案 0 :(得分:1)
我知道它很旧,但是这里我有同样的问题。在iPad上,没问题,viewWillAppear
会被调用,但是在iPhone上我第一次显示控制器时,它不会被调用。
我终于发现这是由于调用了以下代码行:
if let target = displayModeButtonItem.target, let action = displayModeButtonItem.action {
UIApplication.shared.sendAction(action, to: target, from: view, for: nil)
}
在我的UISplitViewController
初始化之后被调用。
当我删除它时,它起作用了。但是我也可以通过在iPhone上使用以下模式来绕过它:.primaryHidden
(我没有在横向使用iPhone,这就是为什么我在此示例中使用的条件是iPhone / iPad)。因此,我的自定义UISplitViewController
如下所示:
override func viewDidLoad() {
super.viewDidLoad()
self.preferredDisplayMode = UIDevice.current.userInterfaceIdiom == .pad ? .allVisible : .primaryHidden
}
希望这可以帮助某人。