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 中传递选定的行

Swift 导航控制器嵌入在带有 segue 的选项卡栏中

VBA如何得到选中的多行 的行号和列号

如何为 didSelectRowAtIndexPath 中的选定笔尖单元触发某些 segue

在没有 Segue 的情况下从 UITableViewCell 打开视图控制器

当你得到一个不相关的行号时,你如何追踪 JavaScript 的“Unexpected token”错误?