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]; 
    } 
} 

如果任何人有一個更好的辦法,請包括它。

相關問題