3

我有以下視圖控制器層次:的iOS向右導航按鈕不UINavigationBar的顯示

  • 視圖控制器VC1
  • 標籤欄控制器TBC1 - 在故事板配置爲導致表視圖控制器TVC1和地圖視圖控制器MVC1
  • 表視圖控制器TVC1
  • 表視圖控制器TVC2

在VC1中,我這樣做:

[self.navigationController pushViewController:TBC1 animated:YES]; 

這正確顯示標籤欄控制器,TVC1焦點。

TVC1在其導航欄中顯示後退按鈕(通過VC1代碼以編程方式創建),這將使我獲得預期的VC1。

但是,從TVC1起,我需要一個導航到TVC2。我正在嘗試向TVC1導航欄添加右鍵,但不顯示。

這是我在TVC1使用的代碼(rightButton是TVC1的UIButton的類型屬性):

self.rightButton = [[UIBarButtonItem alloc] 
          initWithBarButtonSystemItem: UIBarButtonSystemItemAdd 
          target: self 
          action: @selector(MySelector:)]; 
    self.rightButton.style = UIBarButtonItemStyleBordered; 
    self.rightButton.title = @""; 
    self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects: self.rightButton, nil]; 

(指定空白標題和風格只是爲了確保如果是這樣的問題,這是造成這一點,我不牛逼實際需要的值)

MySelector在TVC1.h聲明:

- (void) MySelector:(id)sender; 

並正確執行了。

但是上面的rightButton不顯示在TVC1導航欄中。

我錯過了什麼? 我懷疑它與VC1和TVC1之間的TBC1(標籤欄),並以某種方式重置導航屬性。

但是,然後我認爲我在TVC1上看到了導航欄,而左側按鈕通向了VC1。 我檢查了在TBC1中,self.navigationItem.rightBarButtonItems有1個對象,其中絕對是我添加的rightButton。

我在哪裏錯了?

注意:以上都可以在iOS 5.0,5.1和6.0的所有仿真器中找到。

+0

您是否在TVC1的'viewDidLoad'中設置了'rightBarButtonItems'? 順便說一句:爲什麼你不只是'self.navigationItem.rightBarButtonItem = self.rightButton;'? –

回答

6

在我看來,你的故事板中的TVC1和TVC2之間缺少UINavigationController。如果您正在使用故事板,則可以在導航控制器本身上創建導航項目「添加」按鈕類型,並向TVC2添加PUSH segue。如果有意義,請參見this圖。如果這不能解決你的問題,那麼請上傳示例代碼,我會看看。

[編輯]

我曾在故事板創建視圖控制器結構轉載您的問題。

storyboard

如果你注意到這裏TVC1沒有它的UINavigationController的,但它是從VC1繼承它。對你的問題的解決方案是,而不是將rightButton添加到self.parentViewController,你會在TVC1中看到rightButton。但是請注意,它也會出現在MVC1中,因爲它屬於TBC1的父項。如果你不想在那裏,你可以在MVC1的viewWillAppear中隱藏右邊的按鈕。以下是代碼。

self.rightButton = [[UIBarButtonItem alloc] 
        initWithBarButtonSystemItem: UIBarButtonSystemItemAdd 
        target: self 
        action: @selector(MySelector:)]; 
self.rightButton.style = UIBarButtonItemStyleBordered; 
self.parentViewController.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects: self.rightButton,nil]; 

如果你想添加右鍵進入TVC1的導航控制器,那麼你需要嵌入到TVC1 UINavigationController的。爲此,請在故事板 - >編輯 - >嵌入 - >導航控制器中選擇TVC1屏幕。當你這樣做時,你的代碼也可以工作,並且會顯示你正確的按鈕,但是由於你的故事板結構,你將會有兩個導航控制器(見下圖)。您需要隱藏父導航控制器到TVC1的視圖已加載,並有左按鈕彈出到父視圖控制器。你在MVC1中也是這樣做的。

希望這會有所幫助!快樂編碼:)

output

+0

爲什麼在每一對視圖控制器之間安裝導航控制器是必須的?我不明白這一點。我在TVC1中獲得導航欄,並在該欄中留下了欄按鈕。我唯一沒有得到的是正確的酒吧按鈕。我的故事板一開始就有導航控制器,其他所有屏幕似乎都能正常工作,左右按鈕正確同時顯示。 –

+0

看到我編輯的答案。如果您的VC想要擁有自己的導航控制器,那麼您需要將它們嵌入到uinavigationcontroller中!您使用後退按鈕看到的是父視圖導航控制器,您可以將視控制器(可能有或沒有導航控制器)推到該控制器上。我想你會通過我編輯的答案來得到它的意思。如果你還有問題,請告訴我。 – applefreak

+0

工作就像一個魅力。標記爲正確並且已投票。我嘗試了parentViewController解決方案,因爲我討厭爲TVC1增加一個NVC到故事板。我不明白爲什麼它適用於VC1,我有兩個按鈕 - 我唯一的NVC是VC(VC1的父母),所以即使VC1也不擁有NVC!另外,如果他們希望導航控制器像堆棧一樣,爲什麼他們提出了這個要求?畢竟,一旦推出,TVC1也會擁有導航欄,因爲它們已經完成了整體設計。你有任何想法可以解釋這個問題嗎? –

0

斯威夫特最近有同樣的問題,發現嵌入子視圖在navigationController仍然是正確的方法才能夠訪問rightBarButtonItems。