【问题标题】:swift: prepareForSegue indexPathForSelectedRow快速:prepareForSegue indexPathForSelectedRow
【发布时间】:2015-09-17 04:56:30
【问题描述】:

我有一个由 cellForRowAtIndexPath 填充的 UITableView:

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

    var cell: UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("customTableViewCell") as! UITableViewCell
    let task = frc.objectAtIndexPath(indexPath) as! Task

        cell.textLabel?.text = task.summary
        var detail = task.detail
        var context = task.context
        var due = task.date
        var status = task.status
        var responsible = task.responsable
        var folder = task.folder

        cell.detailTextLabel?.text = "Contexte: \(context), Detail: \(detail), Status: \(status), Ending date: \(due)"

    return cell
}

在情节提要上,我在单击 tableView 的一个单元格以打开 detailViewController 时进行了转场

这是我的 didSelectRowAtIndexPath:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath)
    self.name = cell!.textLabel!.text!
    println(self.name)
    self.performSegueWithIdentifier("Show Detail", sender: indexPath);
}

还有prepareForSegue:

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

    if let identifier = segue.identifier{

        switch identifier {
            case "Show Detail":


                let indexPath = self.tableView.indexPathForSelectedRow()
                let editTaskVC = segue.destinationViewController as! EditTaskViewController

                editTaskVC.Name = "cell.textLabel?.text is what I would like to.."


            default: break
        }
    }

}

如果我执行editTaskVC.Name = indexPath?.description,我可以看到单击的单元格的描述,例如<NSIndexPath: 0x78f96ab0>...

是否有可能,而不是打印 indexPath 的描述,而是打印单击行的 cell.textLabel?.text?

我在论坛上看过很多很多教程或帖子,但我没有成功解决我的问题...

感谢您的帮助。

问候。

【问题讨论】:

    标签: swift uitableview row segue didselectrowatindexpath


    【解决方案1】:

    您的意图是将cell.textLabel?.text 传递给目标视图控制器,对吗?

    你走的是不必要的弯路。 performSegueWithIdentifier: 中的sender 参数可以接收AnyObject,因此您可以直接将name 传递给它。

    self.performSegueWithIdentifier("Show Detail", sender: name)

    这样,prepareForSegue 将拥有您需要传递给下一个视图控制器的项目。只需分配 editTaskVC = sender as! String 即可。

    您缺少的知识是,performSegueWithIdentifier: sender 中的sender 参数会自动将发件人的内容传递给prepareForSegue,作为发件人参数。

    【讨论】:

    • 好的,这就是我刚刚所做的:self.performSegueWithIdentifier("Show Detail", sender: self.name);didSelectRowAtIndexPath,然后editTaskVC.Name = sender as? StringprepareForSegue 发件人为零。我错过了什么吗?
    • 您能否在拨打self.performSegueWithIdentifier("Show Detail", sender: self.name) 之前拨打println(self.name) 电话并首先确保它不为零?
    • 虽然您可以将字符串作为发件人传递,但这不是它的用途
    【解决方案2】:

    既然你已经有了索引路径,你可以简单地调用表格的cellForRowAtIndexPath来获取单元格:

    if let indexPath = self.tableView.indexPathForSelectedRow() {
        if let cell = self.tableView.cellForRowAtIndexPath(indexPath) as? UITableViewCell {
            let editTaskVC = segue.destinationViewController as! EditTaskViewController    
            editTaskVC.Name = cell.textLabel?.text
        }
    }
    

    indexPathForSelectedRow 仅在 2 种情况下返回 nil

    • 如果索引超出范围
    • 如果单元格不可见

    【讨论】:

    • 所以你想让我在cellForRowAtIndexPath 上试试这个?让我们试试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多