从另一个类加载函数在Swift IOS中崩溃

问题描述

在导航控制器弹出回到ViewController1之前,我想从ViewController 2加载功能checkStatus()(这是ViewController1的一部分)。 不幸的是,当调用函数时,该应用程序在加载后立即崩溃,我真的很沮丧,因为我不知道自己做错了什么。

ViewControllers嵌入在导航控制器中。

ViewController1中的代码

func checkStatus(){
/* setting Label texts (Outlets) to a specific value but it is 
irrelevant as the compiler does not even get to 
    this point. The program crashes as soon as the function is called (tried it with prints).*/

ViewController2中的代码

@IBAction func didTapBack(_ sender: UIButton){
// first the function is animating something inside the VC2
ViewController1().checkStatus() // function gets called here
self.navigationController?.popToRootViewController(animated: false)
}

我很感谢任何帮助。

解决方法

您可以使用委托模式在您的情况下调用函数。

ViewController代码:

import UIKit

class ViewController: UIViewController,SecondViewControllerDelegate {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    
}

@IBAction func gotoSecondVC(_ sender: UIButton) {
    
    let secondVC = self.storyboard?.instantiateViewController(identifier: "SecondViewController") as! SecondViewController
    secondVC.delegate = self
    self.navigationController?.pushViewController(secondVC,animated: true)
    
}

func checkStatus() {
    print("\(#function) called...")
}

}

SecondViewController代码:

import UIKit

protocol SecondViewControllerDelegate: class {
    func checkStatus()
}

class SecondViewController: UIViewController {

    weak var delegate: SecondViewControllerDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    @IBAction func backButtonTapped(_ sender: UIButton) {
        delegate?.checkStatus()
        self.navigationController?.popViewController(animated: true)
    }

}
,

我已经将viewController推送到导航堆栈,然后弹出到根Viewcontroller。

第一个ViewController

class ViewController: UIViewController {
override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func firstAction(_ sender: Any) {
    let vc = UIStoryboard.init(name: "Main",bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
    self.navigationController?.pushViewController(vc,animated: true)
}

func callFunc(){
    print(#function)
}
}

第二个ViewController

class SecondViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func secondAction(_ sender: Any) {
    ViewController().callFunc()
    self.navigationController?.popToRootViewController(animated: true)
}
}