2014-09-28 62 views
18

好了,所以我有一個TableView場景,我打算把一個按鈕,在每個單元的,我需要每個單元格,點擊後,segue自身的ViewController現場。換句話說,我需要知道如何將一個按鈕連接到一個場景(我現在唯一的按鈕是「牛奶」)斯威夫特:請按鍵觸發SEGUE到新場景

我知道如何創建一個IBAction鏈接到一個按鈕,但是我會怎樣在IBAction

我是初學者,所以我需要一步一步的解釋。我已經包含了我的故事板的圖片。我還沒有寫任何代碼。 enter image description here

回答

28

如果你想讓一個按鈕觸發segue過渡,最簡單的事情就是控制+點擊按鈕到視圖控制器並選擇Segue選項(如push)。這將在IB爲您進行連接。

如果您想自己手動編寫代碼,可以通過命名segue來完成(有一個標識符選項,您可以在創建它之後設置它 - 您仍然需要在IB中創建segue之前,你可以做到這一點),然後你可以用這個代碼觸發它:

V2

@IBAction func about(sender: AnyObject) { 
    performSegueWithIdentifier("about", sender: sender) 
} 

V3

@IBAction func about(_ sender: Any) { 
    performSegue(withIdentifier: "about", sender: sender) 
} 
+0

好吧,我控制點擊的,現在當我點擊按鈕與「SIGABRT」 – skyguy 2014-09-28 20:16:27

+0

沒關係我得到了它 – skyguy 2014-09-28 21:06:22

+0

我覺得應該是** self.performSegueWithIdentifier(「約」,發件人的AppDelegate的第一行中的應用程序崩潰:發件人)** – Mehmet 2015-06-22 12:55:25

13

您可以使用delegation pattern。假定你已經實現了一個自定義表格單元格,你可以在它的類中定義一個屬性來保存你認爲有助於識別該行的任何東西 - 它可以是它的索引,或者(我喜歡的方式)一個代表數據顯示在單元格中(我打電話給它MyCellData

這個想法是讓單元通知表格視圖控制器關於該按鈕上的一個點擊,傳遞有關該行(顯示的數據)的相關數據。表格視圖控制器然後啓動一個segue,並且在覆蓋的prepareForSegue方法中,它將單元格傳遞的數據存儲到目標控制器。這樣,如果您必須顯示關於該行的詳細信息數據,則您擁有所有相關信息,例如詳細信息數據本身,或目標視圖控制器可用於從本地數據庫或a。檢索數據的標識符遠程服務。

定義一個協議:

protocol MyCellDelegate { 
    func didTapMilk(data: MyCellData) 
} 

然後宣佈在細胞類名爲delegate屬性,從IBAction爲

class MyTableCell : UITableViewCell { 
    var delegate: MyCellDelegate? 
    var data: MyCellData! 

    @IBAction func didTapMilk() { 
     if let delegate = self.delegate { 
      delegate.didTapMilk(self.data) 
     } 
    } 
} 

下一頁調用其didTapMilk方法,實現你的表視圖協議控制器,以及替代prepareForSegue

extension MyTableViewController : MyCellDelegate { 
    func didTapMilk(data: MyCellData) { 
     performSegueWithIdentifier("mySegueId", sender: data) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
     if segue.identifier == "mySegueId" { 
      let vc: MyDestinationViewController = segue.destinationViewController as MyDestinationViewController 
      vc.data = sender as? MyCellData 
     } 
    } 
} 

當然,您需要在目標視圖控制器上使用data屬性才能使用該屬性。如上所述,如果它顯示關於該行的詳細信息,則可以將所有必需的數據嵌入到您的類中 - 或者至少需要從任何來源(如本地數據庫,遠程服務,等等。)。

最後,在的cellForRowAtIndexPath,存儲在單元格中的數據,並設置其delegate屬性爲self

extension MyTableViewController : UITableViewDataSource { 
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let data: MyCellData = retrieveDataForCell(indexPath.row) // Retrieve the data to pass to the cell 
     let cell = self.tableView.dequeueReusableCellWithIdentifier("myCellIdentifier") as MyTableCell 
     cell.data = data 
     cell.delegate = self 

     // ... other initializations 

     return cell 
    } 
} 
0

使用self.performSegueWithIdentifier("yourViewSegue", sender: sender)您的事件處理按鈕的點擊下:

@IBAction func redButtonClicked(sender: AnyObject) { 
    self.performSegueWithIdentifier("redView", sender: sender) 
} 

在上面代碼,redView是segue標識符。