0

我有一个分割VC作为我的应用程序的入口点。细节VC是一个UINavigationController,我总是隐藏主VC,因此我只能在工具栏的弹出窗口中使用它。UIBavButton在UINavigationController的工具栏中,是分割VC的详细视图

我的问题是,我没有办法将barButtonItem从主VC放到我的VC细节中。工具栏总是空的(我不得不使用self.toolbarHidden = NO;强制它显示,因为顶部有一个导航栏)。

我在UINavigationController的(实际细节VC)下面的代码:

-(void) setBarButtonItem:(UIBarButtonItem *)barButtonItem { 
    NSLog(@"adding toolbar button: %@", barButtonItem.title); 

    UIToolbar *toolbar = [self toolbar]; 

    NSMutableArray *toolbarItems = [toolbar.items mutableCopy]; 

    if (_barButtonItem) [toolbarItems removeObject:_barButtonItem]; 

    if (barButtonItem) [toolbarItems insertObject:barButtonItem atIndex:0]; 

    _barButtonItem = barButtonItem; 
} 

我缺少的东西?我也尝试将其插入到导航栏而不是工具栏中,但它并没有显示在那里。请在评论中提供我没有提供的任何信息。

回答

0

如果其他人正在尝试做同样的事情,我将离开一个实现,在SplitViewController中将UINavigationController作为Detail VC并在每个视图控制器的顶部都有按钮,当您浏览以显示/隐藏主VC:

您的详细VC必须实现以下协议(所以你需要@synthesize的barButtonItem):

@protocol SplitViewBarButtonItemPresenter <NSObject> 
@property (nonatomic, strong) UIBarButtonItem *barButtonItem; 
@end 

你需要抓住并保持barButtonItem从willHideViewController通过:在你的细节VC,但你必须在主VC中完成。使用以下在您的主VC:

- (BOOL) splitViewController:(UISplitViewController *)sender 
    shouldHideViewController:(UIViewController *)vc 
       inOrientation:(UIInterfaceOrientation)orientation { 

    return YES; 
} 

- (void)splitViewController:(UISplitViewController *)svc 
    willHideViewController:(UIViewController *)aViewController 
      withBarButtonItem:(UIBarButtonItem *)barButtonItem 
     forPopoverController:(UIPopoverController *)pc { 

    barButtonItem.title = self.title; 

    [self splitViewBarButtonItemPresenter].barButtonItem = barButtonItem; 

} 

- (void)splitViewController:(UISplitViewController *)svc 
    willShowViewController:(UIViewController *)aViewController 
      withBarButtonItem:(UIBarButtonItem *)barButtonItem 
     forPopoverController:(UIPopoverController *)pc { 

    [self splitViewBarButtonItemPresenter].barButtonItem = nil; 

} 

- (id <SplitViewBarButtonItemPresenter>) splitViewBarButtonItemPresenter { 

    id detailVC = [self.splitViewController.viewControllers lastObject]; 

    if ((![detailVC isKindOfClass:[MainDetailVC class]]) || (![detailVC conformsToProtocol:@protocol(SplitViewBarButtonItemPresenter)])) { 

     detailVC = nil; 
    } 

    return detailVC; 
} 

在每一个你想要的按钮显示视图控制器,使用下面的代码(你也可以把它放进一个类,从它继承,如果他们都同一类型):

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    UIBarButtonItem *newBtn = [[UIBarButtonItem alloc] 
      initWithTitle:@"Show Master MC" // might want a better title 
      style:UIBarButtonItemStylePlain 
      target:self action:@selector(forceOpenMasterVC)]; 

    self.navigationItem.rightBarButtonItem = newBtn; 

} 

-(void)forceOpenMasterVC { 
    [((MainDetailVC *) self.navigationController) forceOpenMasterVC]; 
} 

然后在您的详细信息VC,使用以下命令:

#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
// Above line is needed because of self.barButtonItem.action 
// It doesn't leak as far as I can tell 

-(void)forceOpenMasterVC { 
    // Grab the Master VC 
    UIViewController * vc = [[self.splitViewController viewControllers] objectAtIndex:0]; 

    if (self.barButtonItem) { 
     [self.barButtonItem.target 
      performSelector:self.barButtonItem.action 
      withObject: self.barButtonItem]; 
    } 
} 

如果任何人有一个更好的办法,请包括它。

相关问题