2017-08-27 56 views
-1

我有一個tableview,我想在另一個視圖控制器中顯示單元細節。將信息傳遞到新視圖控制器

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let selectedCell = listAthkar[indexPath.row] 
    let destinationVC = showCellVC() 
    destinationVC.cellTitle.text = selectedCell.title 
    destinationVC.cellDisc.text = selectedCell.details 
    performSegue(withIdentifier: "showCell", sender: self) 
} 

showCellVCUILabeltextview,我想將數據傳遞到的數據從核心數據的到來。 每當我按下一個單元格時,該應用程序崩潰。

以下是錯誤我得到

fatal error: unexpectedly found nil while unwrapping an Optional value 2017-08-27 02:46:29.315056-0400 AthkarKF[13152:3972483] fatal error: unexpectedly found nil while unwrapping an Optional value

我認爲錯誤是不言自明的,但我不知道哪裏是可選的值,我不知道這是否是正確的方法將數據傳遞給另一個VC。

你可以請幫忙,我會很感激。

+2

https://stackoverflow.com/questions/32170456 /什麼 - 致命錯誤 - 意外發現 - 零 - 解包 - 可選 - 價值https://stackoverflow.com/questions/29734954/how-do-you-share-data-between-view-控制器和其他對象在迅速。歡迎來到SO。哈立德,請確保您在提問之前先搜索線索。如果沒有幫助,您可以發佈問題並告訴我們爲什麼解決方案不起作用,並且幫助您更容易,而不是發佈重複內容。 :) GL。 – 2017-08-27 07:00:20

+2

你必須在'prepareForSegue'方法中傳遞數據,而不是'tableView:didSelectRow',顯示'prepareForSegue'方法 –

回答

0

你應該做的是通過prepareForSegue:sender:方法傳遞所需的數據。你可以通過執行實現這一目標以下:

1-聲明selectedCell作爲一個實例變量是在整個視圖控制器可訪問的:從

// for sure you'll need to declare its data type... 
var selectedCell:... 

2-刪除「傳遞數據」的代碼tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)委託方法,所有你所要做的就是執行SEGUE:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    selectedCell = listAthkar[indexPath.row] 
    performSegue(withIdentifier: "showCell", sender: self) 
} 

3-通過它實現prepareForSegue:sender:並傳遞數據:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // you may need to check the segue identifier in case of your view controller contains multiple segues 
    if segue.identifier == "showCell" { 
     let destinationVC = segue.destination as! showCellVC() 
     destinationVC.cellTitle.text = selectedCell.title 
     destinationVC.cellDisc.text = selectedCell.details 
    } 
} 


通常,最終的結果應該是類似:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    // STEP #01: 
    // for sure you'll need to declare its data type... 
    var selectedCell:... 

    // STEP #02: 
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     selectedCell = listAthkar[indexPath.row] 
     performSegue(withIdentifier: "showCell", sender: self) 
    } 

    // STEP #03: 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // you may need to check the segue identifier in case of your view controller contains multiple segues 
     if segue.identifier == "showCell" { 
      let destinationVC = segue.destination as! showCellVC() 
      destinationVC.cellTitle.text = selectedCell.title 
      destinationVC.cellDisc.text = selectedCell.details 
     } 
    } 
} 
+0

let destinationVC = segue.destination as! showCellVC()'as! showCellVC'或'as! showCellVC()「? – 2017-08-27 08:38:38

+0

@OmniRingo我不知道有什麼區別。無論如何,假設'showCellVC()'應該返回一個* valid * UIViewController,它應該是'let destinationVC = segue.destination as! showCellVC()'。 –

相關問題