2016-03-07 47 views
0

從UITableViewCell中的單元格向新的視圖傳遞參數數據的正確方法是什麼?在新的UIView中獲取點擊UITableViewCell的對象?

我從我的UITableViewCell中的原型單元格中指定了一個segue,它將它鏈接到一個新的UIVIew並將其設置爲show (aka push)。新的UIView顯示,但我不知道如何告訴UIView選擇的部分/行或告訴它有關與該選擇相關聯的對象。

我的代碼的簡化版本如下:

class MyTableViewController : UITableViewController { 

    // other code omitted 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     let files = filesByDate[filesByDateKeys![indexPath.section]] 
     self.selectedFile = files![indexPath.row] 
    } 

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

     if (segue.identifier == "SegueToFileDetails") { 
      let destinationViewController = segue.destinationViewController as! FileDetailsViewController 
      destinationViewController.file = self.selectedFile 
     } 
    } 
} 

class FileDetailsViewController : UIViewController { 
    var file: NSURL 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     print("File: ", file) 
    } 
} 

我發現發生什麼tableView()功能的prepareForSegue() functon後調用,導致文件屬性是零的時候viewWillAppear()被調用。

回答

0

有點多搜索出現了這個其他post,這表明了正確的做法。我的問題中的tableView()函數是不需要的。相反,(在斯威夫特2):

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

    if (segue.identifier == "SegueToFileDetails") { 
     let destinationViewController = segue.destinationViewController as! FileDetailsViewController 

     let path = self.tableView.indexPathForSelectedRow 
     let files = filesByDate[filesByDateKeys![path!.section]] 

     destinationViewController.file = files![path!.row] 
    } 
} 

如果你想簡單地做行爲基於特定的目標類的基礎上,另一項建議:

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

    if let destinationViewController = segue.destinationViewController as? FileDetailsViewController { 

     let path = self.tableView.indexPathForSelectedRow 
     let files = filesByDate[filesByDateKeys![path!.section]] 

     destinationViewController.file = files![path!.row] 
    } 
}