2012-04-02 112 views
5

在之前的XCode版本中,我已經設置了一個導航控制器,但我使用最新版本並嘗試使用故事板進行設置。我有Tab Bar Controller,它提供兩種形式。第二種形式有一個UITableview,當用戶使用導航控制器進行選擇時,我想要移動到另一個窗體。我已經闡述了我的關係如何看下面。使用故事板設置導航控制器的問題

enter image description here

這個問題似乎是與我的關係成立。我已經將控件從第二個窗體中單擊到導航控制器,彈出窗口爲我提供了「Push,Modal或Custom」選項。我選擇'推',但是當我嘗試運行下面的代碼ir不起作用。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger row = [indexPath row]; 
    NSString *tSel = [listContents objectAtIndex:row]; 

    ConstantRateController *detailController = [[ConstantRateController alloc] initWithNibName:@"ConstantRateController_iPhone" bundle:nil];   
    [self.navigationController pushViewController:detailController animated:YES] 
} 

我已經運行代碼通過調試器,它運行沒有錯誤,但下一個窗體不顯示。

回答

9

從你的描述,這聽起來像有三個問題:

  1. 推塞格斯要求源視圖控制器嵌入在導航控制器 - 相反,您有源視圖控制器試圖將導航控制器。

  2. 目標視圖控制器也需要在故事板中。

  3. 一旦你使用故事板,你通常不希望按照從故事板前世界推動新的視圖控制器的模式(即創建一個視圖控制器,並推動它在tableView:didSelectRowAtIndexPath:)...這樣做會重複一些故事板爲你做的工作。

相反:

  1. 把你的表視圖控制器到導航控制器,並在標籤視圖控制器導航控制器。(您可以使用編輯器>嵌入菜單或通過將它們拖出庫並拖動它們之間的「關係」連接來執行此操作。)

  2. 將您的目標視圖控制器放入故事板(如果它不是已經)通過從庫中拖出視圖控制器並將其類設置爲您的視圖控制器類(ConstantRateController)。

  3. 拖動從表視圖單元格到目的地視圖控制器推賽格瑞:

drag to create segue

畢竟三個步驟,你的故事板應該是這樣的:

enter image description here

最後,在表格視圖控制器中執行以下操作:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // test segue.identifier if needed 
    MyViewController *viewController = segue.destinationViewController; 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    // set properties of viewController based on selection indexPath 
} 

segue創建並推動視圖控制器;所有你需要做的就是配置它,以便它的內容反映導致segue的表選擇。 (請注意,如果你從表視圖控制器有多個塞格斯,你應該給每一個唯一的標識符IB和prepareForSegue:sender:測試配置相應的目的地視圖控制器)。


如果你需要支持多個基於哪個單元被選中,從表格視圖中跳出來,這有點不同。顯然,故事板無法知道由您的委託/數據源填充的單元格,因此您無法從單元格中設置segues ...至少,不在動態表中。

這聽起來像你可能像一個設置視圖,你有一個靜態的單元格,其中每個應該延續到另一個視圖(如一些設置頁面)。在這種情況下,您可能需要查看從故事板中獲得的另一個功能:靜態表格。如果您在IB中選擇表視圖(而不是表視圖控制器),屬性檢查器的頂部允許您在動態原型和靜態單元之間切換 - 前者是我上面描述的,後者允許您創建單元格並在IB中完整地編輯和編輯其內容。使用靜態單元格,您可以在每個單元格中創建一個不同的... ...所以您可以在IB中幾乎完全製作一個類似多頁設置的用戶界面(當然,當交換機翻轉時,仍然需要代碼才能執行某些操作) )。

如果你需要支持多個塞格斯了動態表的,你需要兩樣東西:

  1. 不同來源的塞格斯 - 你不能有多個塞格斯現身的一個單元格,但是你可以有多個從(table)視圖控制器本身出來的segues。

  2. 根據用戶的行爲選擇segue的邏輯。在這裏,我們回到tableView:didSelectRowAtIndexPath:,但不是創建新的視圖控制器,並將其推到導航控制器上或以模態方式呈現它,您只需致電performSegueWithIdentifier:self即可。

有這樣的this answerApple's view controllers guide更詳細一點,多在一般故事板的編程習慣:

+0

感謝您的回覆,我按照說明添加了上面的代碼,但是當我運行它prepareForSegue永遠不會被調用。我錯過了什麼? – user616076 2012-04-03 11:24:15

+0

熱門猜測:1)你的'prepareForSegue:sender:'方法在正確的類中嗎?它應該在視圖控制器中啓動segue(你的表視圖控制器)。 2)表視圖控制器實際上是那個類嗎?檢查IB中的Identity inspector,確保它不是通用的'UITableViewController'。 – rickster 2012-04-03 16:00:39

+0

現在工作正常,謝謝你,這是因爲我沒有正確設置Segue標識符。如果我想切換到多個Segue,會發生什麼情況,從我的表格中可以看出,每個選擇都可以轉到其他任何一種形式? – user616076 2012-04-04 10:10:57

0

嘗試取出「loadView」方法,並將viewDidLoad留在要顯示的ViewController類上。

2

Usualy當你想使用一個導航控制器,你必須把它嵌入...

Xcode中包含導航和標籤欄 控制器加入一個偉大的方式 - 儘管它隱藏掉一點點。首先,選擇 視圖控制器並轉到編輯器菜單 - >嵌入 - > Tabbar 控制器。 Xcode會自動創建我們的新控制器,並連接現有的視圖控制器。再次選擇查看 控制器,這次進入編輯器菜單 - >嵌入 - > 導航控制器。您將看到Xcode在標籤欄控制器和視圖控制器之間插入了新的導航控制器 。非常好 - 迄今爲止,太棒了!您的意見應該像 這...

[來源:http://maybelost.com/2011/10/tutorial-storyboard-in-xcode-4-2-with-navigation-controller-and-tabbar-controller-part1/]

0

你看到三個塞格斯(「推,模態或自定義」),並沒有看到「根視圖控制器',如果你有你的導航控制器從常規的ViewController CONVERTED通過改變它的CUSTOM CLASS。是的,它在Storyboad中稱爲「導航控制器」。但是它的黃色圖標是不同的。它缺少屬性中的「導航控制器」部分,它不能用作導航控制器。這可以通過更改Storyboard文件的xml源來解決。它真的令人困惑,爲什麼他們稱之爲「嵌入」。

相關問題