2015-04-07 48 views
0

我對Swift還很陌生,並且在做一些個人項目來幫助我理解事情。MasterViewController BarButton在顯示詳細信息後失蹤Segue被觸發

現在,我使用Master-Detail應用程序作爲模板。在MasterViewController上,它是一個動態的TableViewController。

我想要實現的是,當我點擊任何單元格時,MasterViewController將顯示另一個導航列表(我已經設法使用Push segue進行設置),並且在DetailViewController上,而不是調用DetailViewController,它目前正在調用ContentsViewController,它是一個帶有TabBar的ViewController(我也已經使用Ctrl單擊了Cell並使用Accessory Action - > Show)。

源代碼片段觸發SEGUE

MasterViewController.swift

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showContentDetailSegue" { 
     if let indexPath = self.tableView.indexPathForSelectedRow() { 
      performSegueWithIdentifier ("ContentDetailSegue", sender: self) 
     } 
    } 
} 

眼下,ContentsViewController已經顯示沒有問題。但是,左上角的BarButton不再具有切換MasterViewController的主BarButton。

我也試過self.presentViewController,但它將取代整個屏幕,這不是我心目中的,因爲我想保持分割視圖完好無損。

我哪裏錯了?任何幫助表示讚賞。

+0

通常情況下,相應的快捷文件下列代碼,你不應該從prepareForSegue()調用「performSegueWithIdentifier」。後一個函數被調用來設置目標控制器上的一些數據。當它被稱爲一個segue已經在進行中。因此,它看起來像你同時開始兩個賽段,這可能是什麼情況下的問題..你可以重寫代碼,以避免使用prepareForSegue? – Alexey

+0

那我該怎麼去做呢? – Gino

+0

如果你與我分享你的整個項目,然後我會看看。 – Alexey

回答

0

好的,發現另一個問題,當試圖點擊其他選項卡,其中左上角的主將是錯誤的,直到我點擊第一個選項卡。

要解決這個問題,我用的是什麼建議在http://nshipster.com/uisplitviewcontroller/

包含在被迷上了故事板xyzViewController

navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem() 
navigationItem.leftItemsSupplementBackButton = true 
1

最後,我改變了看你的代碼。順便說一下,今天我不得不升級到Xcode 6.3,所以我也必須將你的代碼改爲Swift 1.2(沒有太大變化)。

所以,你的第一個目標是使DetailsViewController成爲一個UITabbar。問題在於該項目的故事板不能反映這種意圖。實際上,SplitVC的第二行不會去Tabbar控制器,但它應該。以下是更正的故事板。

storyboard

第二個問題是在prepareForSegue。你正在第一個內部開始第二個過渡,結果是正確的。但是,您還需要處理第二SEGUE,爲了增加< Back按鈕:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if segue.identifier == "showDetail" { 
     ... 
     // start second segue 
     performSegueWithIdentifier ("ContentDetailSegue", sender: self) 


    } else if segue.identifier == "ContentDetailSegue" { 
     // add back button 
    } 
} 

添加後退按鈕是有點棘手。由於目標VC尚未加載,因此您的不能將加回到其導航欄。它根本不存在(它將在該類的viewDidLoad()方法中提供)。

因此,我們將保存的指針回到一個成員變量按鈕,像這樣:

detailsViewController.leftButton = self.splitViewController?.displayModeButtonItem() 

viewDidLoad安裝:

override func viewDidLoad() { 
    super.viewDidLoad() 

    if let button = leftButton { 
     navigationItem.leftBarButtonItem = button 
    } 
} 

有了這些修復一切完美。你可以找到修改後的代碼here

+0

Darn,這是我必須消化的一些新概念= D,這對我來說是一個快樂的問題。感謝大家,我會解決它,並打破它,並嘗試納入我最近學會的一些概念,如代表。 +1 – Gino