在UISplitViewController的主视图中未调用viewWillAppear

时间:2017-07-13 14:49:45

标签: ios objective-c uisplitviewcontroller

我有一个带有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。 但是这里细节视图控制器不会占据半屏。

1 个答案:

答案 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
}

希望这可以帮助某人。