objective-c - 在纵向模式下推送新 View Controller 后,iOS UISplitViewController 的 Popover Controller 按钮消失

标签 objective-c ios ipad

在我的 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/

相关文章:

objective-c - 强制子类在 Objective-C 中调用其父类(super class)方法

objective-c - 给定年份使用 iPhone SDK 的天数?

objective-c - 如何在屏幕外动画 uiview 并在应用程序启动时停留在那里而不是每次加载 View 时?

objective-c - 在 Objective-C 中如何在运行时获取类信息?

iphone - 播放音频时 AVPlayer 在 StitchedStreamPlayer 示例中崩溃

iphone - iPad 应用程序 UITableView 委托(delegate)方法没有被调用

javascript - 在 iPad 中隐藏地址栏

ios - removeObjectAtIndex : is removing data from the main array and duplicate array as well

iphone - 我们可以使用企业帐户将 WebGL 应用程序部署为 native iOS 应用程序吗

ipad - UIWebView 中的键盘显示然后隐藏在输入焦点上