iPad SplitViewController 以编程方式显示弹出框
Posted
技术标签:
【中文标题】iPad SplitViewController 以编程方式显示弹出框【英文标题】:iPad SplitViewController Show Popover programmatically 【发布时间】:2012-08-08 01:58:51 【问题描述】:我有一个 iPad SplitViewController 应用程序,我在其中以纵向和横向模式隐藏左窗格。当应用程序收到某个通知时,我需要在其弹出窗口中显示左窗格。尽管尝试了许多不同的建议解决方案,但我仍在努力弄清楚如何实现这一目标。
我正在使用包含以下代码的 MultipleMasterDetailManager 实现:
/* forward the message to the current detail view
* all detail views must implement UISplitViewControllerDelegate
*/
-(void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
self.masterBarButtonItem = barButtonItem;
self.masterPopoverController = pc;
barButtonItem.title = NSLocalizedString(@"Show Sidebar", @"Show Sidebar");
[self.currentDetailController.navigationItem setLeftBarButtonItem:self.masterBarButtonItem animated:YES];
/* forward the message to the current detail view
* all detail views must implement UISplitViewControllerDelegate
*/
-(void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
//if (![self.currentDetailController isKindOfClass:[SyncSourceDetailViewController class]])
//
self.masterBarButtonItem = nil;
self.masterPopoverController = nil;
[self.currentDetailController.navigationItem setLeftBarButtonItem:nil animated:YES];
//
详细视图控制器本身也存在类似的方法。
我收到通知时调用的方法如下:
- (void)navigateToLatest
[self navigateToDocumentsTab];
[[self dataLoader] navigateToLatest]; // populates data for the left table view
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
UIView *view = [[[[[splitViewController viewControllers] objectAtIndex:1] viewControllers] objectAtIndex:0] view];
[self.masterDetailManager.masterPopoverController presentPopoverFromRect:CGRectMake(0, 0, 100, 100) inView:view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
这不起作用。我也尝试过使用 presentPopoverFromBarButtonItem 方法,但我似乎无法在代码中找到 leftBarButtonItem。
也许我的做法完全错误。
【问题讨论】:
此视图:UIView *view = [[[[[splitViewController viewControllers] objectAtIndex:1] viewControllers] objectAtIndex:0] view];
这真的是您要使用的父视图吗?
@slf - 你是对的,我一直在继续努力,我已经确定我需要的视图是:self.masterDetailManager.currentDetailController.view。但是这仍然不起作用 - 我感觉这与时间有关,因为此时此视图的 leftBarButtonItem 不存在,masterDetailManager 中的 willHideViewController 在我的 navigateToLatest 方法之后被调用。
@slf - 我已经能够使用类似的代码从 BarButtonItem 显示左侧窗格,所以我知道我离得不远。也许我需要延迟通话以某种方式显示左窗格。
【参考方案1】:
我最终通过在 navigateToLatest 方法中将我的应用程序委托中的“showSidebar”变量设置为 true 来解决此问题。然后在 DetailViewController 的 ViewDidAppear 事件中检查此变量的值,如果为真,则使用以下代码显示侧边栏:
UIPopoverController *masterPopoverController= [[theAppDelegate masterDetailManager] masterPopoverController];
[masterPopoverController presentPopoverFromBarButtonItem:[self.navigationItem leftBarButtonItem] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
[theAppDelegate setShowSidebar:NO];
【讨论】:
以上是关于iPad SplitViewController 以编程方式显示弹出框的主要内容,如果未能解决你的问题,请参考以下文章
iPad splitViewController 弹出主视图
SplitViewController 显示细节 iPad Pro 纵向模式
使用 splitViewController 在 iPad 故事板上出现黑屏
iPad SplitViewController - 使用 iPhone 故事板 ViewController