Segue 没有得到选定的行号
Posted
技术标签:
【中文标题】Segue 没有得到选定的行号【英文标题】:Segue not getting selected row number 【发布时间】:2014-07-04 15:57:28 【问题描述】:我正在将数据从表视图控制器传递到详细视图。我尝试在我的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])"
因此,当应用程序首次在模拟器中启动时选择 Doug 会显示 Bob 的详细信息,因为 indexPathOfSelectedPerson
为 0。点击后退按钮,然后选择 Jill 会显示 Doug 的详细信息,因为当我单击时 indexPathOfSelectedPerson
变为 1道格上一次。我猜问题出在调用方法的顺序上。
【问题讨论】:
【参考方案1】:做这种事情的最好方法是不使用委托。
更新 Swift 4+
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
let selectedIndex = tableView.indexPath(for: sender as! UITableViewCell)
// Do your stuff with selectedIndex.row as the index
原答案
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)
let selectedIndex = self.tableView.indexPathForCell(sender as UITableViewCell)
// Do your stuff with selectedIndex.row as the index
【讨论】:
您添加的行在 Xcode 中给出了关于向下转换 AnyObject 的错误,并建议将行更改为:let selectedIndex = self.tableView.indexPathForCell(sender as UITableViewCell)。这修复了错误。正如你所说,我将 indexOfSelectedPerson 更改为 selectedIndex.row ,一切正常。谢谢。 正是我想要的。在 Xcode 7 (Swift 2.2) 中,您需要将发件人强制转换为UITableViewCell
,如下所示:self.tableView.indexPathForCell(sender as! UITableViewCell)
如果我有不同类型的自定义类单元格那么我如何检测单元格的类型。谢谢【参考方案2】:
Swift 3 更新:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
let selectedIndex = tableView.indexPath(for: sender as! UITableViewCell)!
// Do your actual preparing here...
【讨论】:
【参考方案3】://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])"
【讨论】:
以上是关于Segue 没有得到选定的行号的主要内容,如果未能解决你的问题,请参考以下文章
objectAtIndex 没有在 segue 中传递选定的行
如何为 didSelectRowAtIndexPath 中的选定笔尖单元触发某些 segue