将变量从 tableView 传递给 prepareForSegue?

Posted

技术标签:

【中文标题】将变量从 tableView 传递给 prepareForSegue?【英文标题】:Pass variable from tableView to prepareForSegue? 【发布时间】:2016-07-23 01:14:36 【问题描述】:

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

这是我的代码:

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 中做到这一点?

【问题讨论】:

您希望它在单击单元格时继续吗? 【参考方案1】:
    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 中分配变量名,因为这个函数通常在 tableViews 的生命周期中被多次调用。此外,“名称”需要是一个类变量,以便您可以在一个函数中分配它并在另一个函数中传递它。 cellForRowAtIndexPath 是一个用于为 tableView 的每个单独单元格分配值和 UI 的函数。很少有时间可以用它做其他事情。

【讨论】:

请详细说明...“不要在 cellForRowAtIndexPath 中分配变量名,因为这个函数通常在 tableViews 的生命周期中被多次调用。” 每次调用 tableView.reloadData() 时,都会为表格视图的每个单元格调用 cellForRowAtIndexPath。您在该函数内部声明变量名称首先会阻止它在函数外部使用,因为它是函数的本地变量,其次,您当前的设计将始终等于 tableView 的最后一个元素,而不是任何所需的单元格。如果你想在那里设置 name 的值,你必须设置另一个变量来跟踪选定的单元格,这只是无关紧要的。【参考方案2】:

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

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

【讨论】:

你能贴一些代码,让我知道你要去哪里吗? 我不喜欢为如此简单的步骤发布代码,因为我认为这会导致复制/粘贴编程而不是真正的学习。但是,@Sethmr 为您提供了示例代码。【参考方案3】:

我有另一种方法,即使用 sender.在这种情况下,您可以避免使用全局变量

    首先将您的var paramToPass = val 保存在您的单元格类中。

    sender 字段中,您将发件人设置为yourCell

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

    在prepareSegue函数中:

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

【讨论】:

以上是关于将变量从 tableView 传递给 prepareForSegue?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 didSelectRowAtIndexPath 将变量从 uitableview 传递到第二个 tableview?

将变量传递给在 TabBar 中调用的视图

当我将数据从 TableView 传递给子 PageViewController 时,它可以转到下一个子

Swift iOS - 如何将直接从 TableViewCell 的子类中获取的值传递给 TableView 的 didSelectRow?

将行的值分配给全局变量

将数据从 Parse tableview 传递到 WatchKit