在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的一些建议?
答案 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: