在我的 UISplitViewController 应用程序中,我有
- RootViewController - 左 Pane 中的 View Controller 。
- DetailViewController - 右 Pane 中的 View Controller 。
当点击 RootViewController 中的一个项目(在 UITableView 中)时,新的 View Controller 将设置如下所示:
[detailViewController setViewControllers:[NSArray arrayWithObjects:newViewController, nil] animated:animated];
//detailPane is my DetailViewController
在横向模式下一切都很好。但是,我无法使 UISplitViewController 在纵向模式下按我想要的方式工作,也就是说,当我在纵向模式下启动和使用应用程序时,RootViewController 的弹出按钮没有正确显示在我的 DetailViewController 中。
当我以纵向模式启动应用程序时,弹出按钮会正确显示。但是在弹出窗口中点击一个项目并且在 detailViewController 上设置了一个新的 View Controller 之后,按钮消失了。我必须将设备旋转到横向,然后再旋转回纵向,以使按钮再次出现。
我在应用程序的 AppDelegate 中设置了 UISplitViewController 的委托(delegate),如下所示:
self.splitViewController.delegate = self.detailViewController
这是我的 UISplitViewControllerDelegate 实现
- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc {
NSLog(@"Will hide view controller");
barButtonItem.title = @"Menu";
[self.navigationItem setLeftBarButtonItem:barButtonItem];
self.popoverController = pc;
}
- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
NSLog(@"Will show view controller")
NSMutableArray *items = [self.navigationItem.leftBarButtonItems mutableCopy];
[items removeAllObjects];
[self.navigationItem setLeftBarButtonItems:items animated:YES];
[items release];
self.popoverController = nil;
}
非常感谢任何提示或帮助。 谢谢。
最佳答案
刚刚想出了一个新的解决方案。
子类 UINavigationController
并实现 UISplitViewControllerDelegate
。设置该类的一个实例作为splitViewController的右ViewController。每次你想从主视图更改细节 View Controller 时
NewDetailViewController *newDetailVC = ....// Obtain the new detail VC
newDetailVC.navigationItem.leftBarButtonItem = [[[[self.splitViewController.viewControllers objectAtIndex:1]topViewController]navigationItem ]leftBarButtonItem]; //With this you tet a pointer to the button from the first detail VC but from the new detail VC
[[self.navigationController.splitViewController.viewControllers objectAtIndex:1]setViewControllers:[NSArray arrayWithObject:newDetailVC]]; //Now you set the new detail VC as the only VC in the array of VCs of the subclassed navigation controller which is the right VC of the split view Controller
这对我有用,我可以避免定义空洞协议(protocol)并将主人设置为委托(delegate)人,这是一个很大的权衡。希望对您有所帮助。
关于objective-c - 在纵向模式下推送新 View Controller 后,iOS UISplitViewController 的 Popover Controller 按钮消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7885625/