2014-07-04 31 views
7

我將數據從表視圖控制器傳遞到詳細視圖。我想直接在我的prepareForSegue方法使用indexPath.row,但它顯示的塞戈沒有得到選定的行號

使用未解決的標識符的錯誤「indexPath」

所以,在網上搜索後,我設置的變量indexOfSelectedPerson這是分配的值爲indexPath.row。當我在模擬器中運行應用程序時,問題是prepareForSegue獲取的初始值爲indexOfSelectedPerson(0),然後只有在單擊它後才獲取所選行的值。所以,當我點擊模擬器中的後退按鈕並選擇不同的行時,詳細視圖顯示了我之前選擇的行的信息。

import UIKit 

class MasterTableViewController: UITableViewController { 

    var people = [] 
    var indexOfSelectedPerson = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     people = ["Bob", "Doug", "Jill"] 
    } 

    override func numberOfSectionsInTableView(tableView: UITableView?) -> Int { 
     return 1 
    } 

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int { 
     return people.count 
    } 

    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { 

     let cell = tableView!.dequeueReusableCellWithIdentifier("personCell", forIndexPath: indexPath) as UITableViewCell 

     cell.text = "\(people[indexPath.row])" 

     return cell 
    } 

    override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) 
    { 
     indexOfSelectedPerson = indexPath.row 
    } 


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

     if let mySegue = segue.identifier { 

      if mySegue == "personDetails" { 

       let detailsVC: DetailTableViewController = segue.destinationViewController as DetailTableViewController 

       detailsVC.selectedPersonName = "\(people[indexOfSelectedPerson])" 
      } 
     } 
    } 
} 

因此,選擇道格時,應用程序在模擬器中第一個開始顯示鮑勃的細節,因爲indexPathOfSelectedPerson 0點擊後退按鈕,然後選擇吉爾顯示細節的道格,因爲indexPathOfSelectedPerson成爲1,當我點擊道格以前的時間。我猜這個問題源於調用方法的順序。

回答

16

做這種事情的最好方法是不使用委託。

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    let selectedIndex = self.tableView.indexPathForCell(sender as UITableViewCell) 
    // Do your stuff with selectedIndex.row as the index 
} 
+0

你的添加的行,得到在Xcode關於向下轉換AnyObject錯誤,並建議改變行:讓的selectedIndex = self.tableView.indexPathForCell(發送者作爲的UITableViewCell )。這解決了錯誤。 正如你所說,我改變了indexOfSelectedPerson爲selectedIndex.row,並且一切正常。謝謝。 – Shades

+0

好,我編輯了答案。 – Jack

+2

正是我在找的。在Xcode 7(Swift 2.2)中,您需要強制將發送者轉換爲'UITableViewCell',如下所示: 'self.tableView.indexPathForCell(sender as!UITableViewCell)' –

-1
//In didSelectRowAtIndexPath, you use this code: 

func tableView(tvMain: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     self.performSegueWithIdentifier("yourSegueName", sender: nil) 

    } 

//And prepareForSegue to get IndexPath and send your value 

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

      let indexPath : NSIndexPath = self.yourTableView.indexPathForSelectedRow()! 
      //make sure that the segue is going to secondViewController 
      let detailsVC = segue.destinationViewController as DetailTableViewController 
      detailsVC.selectedPersonName = "\(people[indexPath.row])" 

    } 
1

夫特3更新:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let selectedIndex = tableView.indexPath(for: sender as! UITableViewCell)! 
    // Do your actual preparing here... 
}