引用另一个 UIViewController 导致一个 nil 指针并创建一个新对象

Posted

技术标签:

【中文标题】引用另一个 UIViewController 导致一个 nil 指针并创建一个新对象【英文标题】:Referencing another UIViewController Causes a nil pointer and creates a new object 【发布时间】:2017-06-26 12:41:51 【问题描述】:

我正在创建一个计算器应用程序,我需要在其中从设置页面在单独的视图控制器中设置一个变量。在尝试此壮举时,会发生一些奇怪的事情。首先,它以某种方式返回 nil。然后,它初始化了一个新的视图控制器。然而,当我重新打开旧视图控制器的实例时,所有非静态变量都是相同的。

我的代码可能有错误:

func updateTag(title: String)
    switch(title)
    case "displayWithPrecisionSwitch":
        let mainViewController = storyboard?.instantiateViewController(withIdentifier: "timerViewController") as! ViewController
        mainViewController.updatePercision()
        mainViewController.correctTallyDisplay?.refresh(totalTime: mainViewController.counter.getIntegerTime(), goal: mainViewController.counter.getGoal())
        mainViewController.incorrectTallyDisplay?.refresh(totalTime: mainViewController.counter.getIntegerTime(), goal: mainViewController.counter.getGoal())
        print(mainViewController.correctTallyDisplay?.percision ?? "Warning Nil")
    default:
        print("break")
        break;
    

或在 UI 中:在此处输入图像描述 我只需要找到一种从“timerViewController”调用函数的方法。

【问题讨论】:

【参考方案1】:

是的,当您调用storyboard?.instantiateViewController 时,您正在初始化一个新的视图控制器,您不应该这样做。要简单地调用另一个视图控制器中的方法,您可以使用NSNotificationCenter 和this 一样,或者创建一个delegate 来达到相同的结果。第一个更容易实现。

如果您只需要从另一个视图控制器调用方法,这里是一个示例。假设您的调用者视图控制器正在尝试调用您的被调用者控制器中的方法。

所以在你的被调用者控制器中,你需要在你的viewDidLoad 方法中拒绝接收这种类型的调用。所以把这个代码放在那里进行注册

NotificationCenter.default.addObserver(self, selector: #selector(methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)

那么你需要这个通知调用的方法

func methodOfReceivedNotification(notification: Notification)
    //either replace the function name to your function or call your function here

然后在设置视图控制器或任何其他视图控制器的调用者视图控制器中,当您想调用此注册方法时,只需执行

NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: nil)

【讨论】:

@macrocypher 用简单的设置编辑了我的答案

以上是关于引用另一个 UIViewController 导致一个 nil 指针并创建一个新对象的主要内容,如果未能解决你的问题,请参考以下文章

通过引用传递 UIViewController 或在另一个处理程序类中获得自我控制

如何从另一个 UIViewController 更改分段控件标题(设置)

为啥在另一个快照隔离事务中插入具有引用行的外键引用行的行会导致事务挂起?

以编程方式嵌入 UIViewController?

使用外键发布新实体会导致创建另一个外部实体而不是引用现有实体

C#一个集合引用另一个集合导致一起改变(深度拷贝)