【问题标题】:class data becomes nill when I reference it in my 'prepareForSegue' method当我在“prepareForSegue”方法中引用它时,类数据变为空
【发布时间】:2015-10-08 23:14:29
【问题描述】:

我有一个带有按钮的表格视图,每个按钮都包含一个标签(根据 indexPath.row),当我按下特定按钮时,该单元格内容的详细信息(与名为 EventEntity 的类有关)将被传递通过 'prepareForSegue' 方法到另一个屏幕。

在'infoButtonDidPress'方法中赋值如下:

func infoButtonDidPress(sender: UIButton){
    eventPressed = eventEntities[sender.tag]
println (eventPressed.name) // prints the name, all good here.
}

问题是当我在'prepareForSegue'中将eventPressed的内容分配给destinationVC时,它们是零。代码如下:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "infoButtonSegue"){
        var svc = segue.destinationViewController as! EventDetailsViewController;

    println (eventPressed.name) // NOPE.
    svc.name = eventPressed.name //also NOPE!
}

eventPressed 在 vi​​ewDidLoad 上方声明:

var eventPressed: EventEntity! = EventEntity()

当我尝试使用“NOPE”注释中的任何一行时出现的错误是'Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Appname.EventEntity name]: unrecognized selector sent to instance 0x7fa280e16a50' error

这是怎么回事?

提前致谢!

更新

我已将 performWithSegue 移至 infoButtonDidPress 方法,但我现在无法引用destinationViewController。

我的 infoButtonDidPress 现在看起来像这样:

func infoButtonDidPress(sender: UIButton){
   let eventPressed = eventEntities[sender.tag]

   var destinationViewController: UIViewController = self.destinationViewController as EventDetailsViewController
 // error: the current VC does not have a member named destinationViewController

   self.performSegueWithIdentifier("infoButtonSegue", sender: self)
}

【问题讨论】:

  • 当您将let 放在函数中的 eventPressed 前面时,您正在为此范围创建一个新变量。相反,只需执行eventPressed = eventEntities[sender.tag]
  • 我改变了它,我仍然得到'由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[Appname.EventEntity name]:无法识别的选择器发送到实例0x7fa280e16a50'错误
  • 对我来说看起来像是一个范围。您是否在 viewDidLoad 中使用 var 声明它?在这种情况下,仍然没有声明全局变量。尝试删除 var 看看是否会改变它。
  • @JuliaWill 不会,我在 viewDidLoad 上方声明它。
  • 尝试设置断点,然后在调试器中po eventPressed。

标签: ios swift xcode6


【解决方案1】:

如您所见,prepareForSegue 发生在 infoButtonDidPress 被调用之前。

要解决这个问题,不要从 tableView 中的原型单元格连接 segue,而是从顶部的 viewController 图标连接它。

看到这个:How to wire segue from ViewController icon

确保将标识符设置为"infoButtonSegue"。然后在设置eventPressed 的值后从infoButtonDidPress 调用segue:

func infoButtonDidPress(sender: UIButton){
    eventPressed = eventEntities[sender.tag]
    self.performSegueWithIdentifier("infoButtonSegue", sender: self)
}

然后,在prepareForSegue 中将值传递给目标视图控制器:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "infoButtonSegue") {
        let dvc = segue.destinationViewController as! EventDetailsViewController

        dvc.name = eventPressed.name
    }
}

【讨论】:

  • 我还发现,你太棒了。谢谢!
  • 我还会使用 var svc = segue.destinationViewController 吗!事件详情视图控制器;然后 'svc.variableName' 来引用目标 VC 中的变量?
  • 是的,还是一样。我建议将您的变量 dvc 称为“目标视图控制器”而不是 svc 用于“源视图控制器”。但是,是的,即使您以编程方式调用 segue,您也可以使用相同的方式进行设置。
  • “segue.destinationViewController”中的“segue”位不起作用。在这种情况下,我将如何引用 UIStoryBoardSegue 参数?
  • 你的infoButtonDidPress 应该和我在回答中所说的完全一样。您仍然需要一个单独的 prepareForSegue 函数来进行实际设置。
猜你喜欢
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多