iPad分割视图控制器如何通过编程方式显示弹出窗口

4
我有一个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
@slf - 你说得对,我一直在继续处理这个问题,现在我已经确定了我所需要的视图是:self.masterDetailManager.currentDetailController.view。然而,这仍然不起作用——我感觉这与时间有关,因为在这个时候leftBarButtonItem还不存在,同时masterDetailManager中的willHideViewController方法是在我的navigateToLatest方法之后调用的。 - daveywc
@slf - 我已经能够使用类似的代码从 BarButtonItem 中显示左侧面板,所以我知道我离成功不远了。也许我需要以某种方式延迟调用显示左侧面板的方法。 - daveywc
1个回答

2

我最终解决了这个问题,通过在我的应用程序委托中将一个名为“showSidebar”的变量设置为true。然后在我的DetailViewController的ViewDidAppear事件中,检查这个变量的值,如果为true,则使用以下代码显示侧边栏:

UIPopoverController *masterPopoverController= [[theAppDelegate masterDetailManager] masterPopoverController];
        [masterPopoverController presentPopoverFromBarButtonItem:[self.navigationItem leftBarButtonItem] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
        [theAppDelegate setShowSidebar:NO];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接