2012-08-08 106 views
4

我有一个iPad SplitViewController应用程序,我可以在纵向和横向模式下隐藏左窗格。当应用程序收到某个通知时,我需要在其弹出窗口中显示左窗格。尽管尝试了许多不同的建议解决方案,但我正在努力研究如何实现这一点。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。

也许我正在做这个完全错误的方式。

+0

这一观点:'的UIView *视= [[[[[splitViewController viewControllers] objectAtIndex:1] viewControllers] objectAtIndex:0] view];'这真的是你想要使用的父视图? – slf 2012-08-08 02:42:16

+0

@slf - 你是对的,我一直在继续工作,我已经确定我需要的视图是:self.masterDetailManager.currentDetailController.view。然而,这仍然不起作用 - 我有一种感觉,这是与时间的关系,因为此视图的leftBarButtonItem在此时不存在,并且masterDetailManager中的willHideViewController会在我的navigateToLatest方法后面调用。 – daveywc 2012-08-08 02:52:33

+0

@slf - 我已经能够使用类似的代码显示左侧窗格从BarButtonItem工作,所以我知道我不是太遥远。也许我需要延迟电话以某种方式显示左侧窗格。 – daveywc 2012-08-08 02:53:55

回答

2

我最终解决了这个问题,通过在我的应用程序委托中将“showSidebar”变量设置为navigateToLatest方法中的true。然后在我的DetailViewController的ViewDidAppear事件中,我检查这个变量的值,如果这是真的话,我将介绍使用下面的代码侧边栏:

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