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

时间:2017-06-26 12:41:52

标签: ios swift xcode

我正在创建一个计算器应用程序,我需要在设置页面的单独视图控制器中设置变量。尝试这一壮举时会发生一些奇怪的事情。首先,它以某种方式变量返回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;
    }
}

或在用户界面中:在此处输入图像说明 enter image description here 我只需要找到一种方法来调用来自" timerViewController"。

的函数

1 个答案:

答案 0 :(得分:1)

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

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

因此,在您的被叫方控制器中,您需要在NotificationCenter.default.addObserver(self, selector: #selector(methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil) 方法中使用Resister接收此类型的呼叫。所以把这段代码放在那里进行注册

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)

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

{{1}}