从tableView传递变量到prepareForSegue方法?

3

我的最终目标是在传递一个变量的同时,跳转到另一个视图控制器。

以下是我的代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let name : String=arrDict[indexPath.row].valueForKey("name") as! String
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "SecondSegue" {
        let viewController = segue.destinationViewController as! SecondViewController
        viewController.passedVariable = name
    }
}

正如您所见,我正在尝试将变量name传递到函数prepareForSegue中。正如我所说,我的最终目标是将一个变量传递给另一个视图控制器并打开该视图。

现在,prepareForSegue可以做到这一点,但我只需要传递变量。也许有一种方法可以直接在func tableView中实现?


你希望在点击单元格时进行Segue转场吗? - Sethmr
3个回答

4
    var name: String?    

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        name = arrDict[indexPath.row].valueForKey("name") as? String
        performSegueWithIdentifier("SecondSegue", sender: nil)

    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if let viewController = segue.destinationViewController as? SecondViewController {
            if name != nil {
                viewController.passedVariable = name!
            } else {
                 print("failed to get name from dictionary")
            }
        }
    }

我相信这就是您要找的内容。不要在cellForRowAtIndexPath中分配变量名,因为此函数通常在tableView的生命周期内被多次调用。此外,“name”需要是一个类变量,以便您可以在一个函数中分配它并在另一个函数中传递它。cellForRowAtIndexPath是用于分配tableView每个单独单元格的值和UI的函数。很少有其他事情要做。

请详细说明一下... "不要在cellForRowAtIndexPath中分配变量名称,因为这个函数通常在tableView的生命周期内被多次调用。" - johnniexo88
每次调用tableView.reloadData()时,cellForRowAtIndexPath都会为表格视图拥有的每个单元格调用一次。您首先在该函数中声明变量名称可以防止它被用于函数之外,因为它是局部的,并且其次根据您目前的设计,始终等于tableView的最后一个元素而不是任何所需单元格。如果您想在那里设置name的值,则必须设置另一个跟踪所选单元格的变量,并且只是多余的。 - Sethmr

1

将代码放入didSelectRowAtIndexPath方法中。将所选的indexPath保存到实例变量中并调用你的segue。

在prepareForSegue中,使用保存的indexPath从模型中加载所需的字符串并传递给目标VC(viewController)。


你能发一些代码让我知道你的想法吗? - johnniexo88
我不喜欢为这样简单的步骤发布代码,因为我认为这会导致复制/粘贴编程而不是真正的学习。然而,@Sethmr 给了你示例代码。 - Duncan C

0

我有另一种方法可以使用发送器来完成这个任务。在这种情况下,您可以避免使用全局变量。

  1. 首先,在您的单元格类中保存var paramToPass = val
  2. sender字段中,将发送者设置为yourCell

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.performSegue(withIdentifier: "xxx", sender: partnerCell) }

  3. 在prepareSegue函数中:

    if segue.identifier == "xxx" {
    
        guard let partnerCell = sender as? PartnerTableViewCell else {
            return
        }
    
        yourDestinationController.param = partnerCell.paramToPass
    
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接