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

iPad SplitViewController 内存警告导致主视图出现问题

Ipad SplitViewController 导航到另一个视图