将变量从 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?
当我将数据从 TableView 传递给子 PageViewController 时,它可以转到下一个子
Swift iOS - 如何将直接从 TableViewCell 的子类中获取的值传递给 TableView 的 didSelectRow?