UISplitViewController:如何强制在app启动时显示主popover? (肖像)

时间:2012-05-03 07:02:52

标签: ipad ios5 uisplitviewcontroller portrait ios5.1

在iPad App中我正在使用UISplitViewController。 当应用程序以纵向模式启动时,我需要强制显示主弹出窗口。

现在我正在使用此代码,它在iOS 5.0上运行良好。

if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
   if ([[[AppDelegate sharedAppDelegate] splitViewController] respondsToSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]]) {
      [[[AppDelegate sharedAppDelegate] splitViewController] performSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]];
   }            
}

但是在iOS 5.1(使用新型主弹出窗口)中,行为似乎是随机的。 有时弹出窗口全屏显示,有时效果很好。

5.1的一些建议?

8 个答案:

答案 0 :(得分:26)

这里没有关于5.1的建议,而是关于8.0的建议:

现在使用iOS8,UISplitViewController配置有很多新方法。

在您的情况下,juste在preferredDisplayMode中设置了正确的值,例如在masterViewController viewDidLoad中。

<强>目标-C:

- (void)viewDidLoad {
    // configuring splitviewcontroller
    self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;

    //....
}

<强>夫特:

    override func viewDidLoad() {
        self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
    }

但它当然只是iOS8。

答案 1 :(得分:13)

我在这个问题上挣扎了一段时间,现在我对解决方案并不是百分之百满意,但考虑到目前的限制,这是我唯一能够想到的。

首先,覆盖以下委托方法:

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController

并使用它来获取对条形按钮项的引用,并将其存储在iVar中:

barButtonForMaster = barButtonItem;

然后,当您想要显示主视图控制器时,请进行如下调用:

[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster];

如果您想在开始时执行此操作,请使用一些延迟以防止应用崩溃(感谢有用的评论):

[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster afterDelay:1];

在这种情况下,您可以在拆分视图委托方法中执行选择器。

答案 2 :(得分:13)

根据Rob的回答,这对我很有用(在viewDidLoad of detail屏幕中):

//If in portrait mode, display the master view
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
    [self.navigationItem.leftBarButtonItem.target performSelector:self.navigationItem.leftBarButtonItem.action withObject:self.navigationItem];
}

无需获取单独的引用,而是使用self.navigationItem.leftBarButtonItem

答案 3 :(得分:7)

对于iOS8,最简单的方法是:

 self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;

我在第一次启动应用程序时使用此功能,以便在masterViewController中显示登录。 在所有其他情况下,我使用

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic

答案 4 :(得分:5)

如果您在应用启动时需要它,请在详细信息视图控制器中覆盖此方法:

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
    return NO;
}

但是,如果你随后需要它来隐藏它看起来好像没有调用该方法,那么你必须手动隐藏它。

答案 5 :(得分:1)

稍微不那么狡猾的变化(快速):

let btn = self.splitViewController!.displayModeButtonItem()
btn.target?.performSelector(btn.action, withObject: btn)

答案 6 :(得分:1)

我使用这个解决方案:
在viewDidLoad中的splitViewController中,将displayMode设置为.primaryOverlay

override func viewDidLoad() {
    if self.isCollapsed == false, self.displayMode == .primaryHidden {
        self.preferredDisplayMode = .primaryOverlay
    }
}

在viewWillAppear中将其设置回.automatic

override func viewWillAppear(_ animated: Bool) {
    self.preferredDisplayMode = .automatic
}

这样主视图将在启动UISplitViewController时显示,并且在方向改变后会有默认行为。

答案 7 :(得分:0)

无需在barButtonItem周围保留愚蠢的引用。只需调用相同的目标/操作即可。请参阅我的回答https://stackoverflow.com/a/25695923/1021430

目标是拆分视图控制器,操作是toggleMasterVisible: