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

ale*_*omp 26 portrait ipad uisplitviewcontroller ios5 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]];
   }            
}
Run Code Online (Sandbox Code Playgroud)

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

5.1的一些建议?

Mar*_*tin 27

这里没有5.1的建议,但8.0的建议:

现在使用iOS8,有许多新的UISplitViewController配置方法.

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

Objective-C的:

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

    //....
}
Run Code Online (Sandbox Code Playgroud)

迅速:

    override func viewDidLoad() {
        self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
    }
Run Code Online (Sandbox Code Playgroud)

但它当然只是iOS8.

  • 这迫使并排显示.它不会像OP请求的那样在弹出模式下显示主视图. (6认同)

小智 13

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

首先,重写以下委托方法:

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
Run Code Online (Sandbox Code Playgroud)

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

barButtonForMaster = barButtonItem;
Run Code Online (Sandbox Code Playgroud)

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

[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster];
Run Code Online (Sandbox Code Playgroud)

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

[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster afterDelay:1];
Run Code Online (Sandbox Code Playgroud)

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


Set*_*dor 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];
}
Run Code Online (Sandbox Code Playgroud)

不需要使用self.navigationItem.leftBarButtonItem来获取单独的引用

  • AFAIK编译器分析方法调用并添加代码来管理ARC引用计数器(以管理垃圾收集).调用这样的方法有点像在Java中使用反射(在运行时完成),因此在这种情况下编译器不能执行其refCount魔法.但是,只要调用的方法不返回任何已分配的对象(这将是泄漏),它就不会有任何问题.在这种情况下,我们不会从被调用的方法返回任何内容.要避免此警告,请参阅:http://www.learningipadprogramming.com/2012/04/03/how-to-ignore-performselector-leak-warning/ (2认同)

aqu*_*s68 7

对于iOS8,最简单的方法是使用以下内容:

 self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
Run Code Online (Sandbox Code Playgroud)

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

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic
Run Code Online (Sandbox Code Playgroud)


Sea*_*anR 5

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

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

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