从另一个类调用方法时发生致命错误

时间:2016-08-04 08:03:02

标签: ios swift uiviewcontroller

我有两个视图控制器。 我在第一个视图控制器中有一个测试方法,如下所示

class ViewController: UIViewController {

   @IBOutlet weak var myLabel: UILabel!

   override func viewDidLoad() {
       super.viewDidLoad()
       myLabel.hidden = true

   }

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

   func showLabel(){
       myLabel.hidden = false
   }

}

如果我从另一个类调用showLabel,它会给我fatal error: unexpectedly found nil while unwrapping an Optional value

另一个viewController如下

class SecondViewController: UIViewController {

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

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

   @IBAction func Save(sender: AnyObject) {
       ViewController().showLabel()
   }
}

如果我从ViewController调用showLabel方法,它的工作正常,但如果我从SecondViewController调用它,那么我就会出错。

4 个答案:

答案 0 :(得分:0)

你的视图控制器都使用storyboard / xib;当您在代码中创建这样的视图控制器实例时(就像在\CMS\CMSModules\Content\CMSDesk\Properties\Advanced\EditableContent\Main.aspx.cs函数中一样),您需要使用Save类或UINibinstantiateViewControllerWithIdentifier方法,因为默认初始值设定项(如您UIStoryboard使用的init()对于outlet和storyboard / xib相关文件一无所知(outlet属性ViewController将始终为零)。

如果您的代码不仅仅是模板,那么您应该重构它,因为在视图控制器中执行UI更改(未在屏幕上显示)(并且永远不会)没有意义

答案 1 :(得分:0)

你必须使用委托:
1 - 在您的SecondViewController中添加一位代表,其中包含您的第一个视图控制器ViewController的类型

class SecondViewController: UIViewController {
   var delegate: ViewController? // add delegate
   override func viewDidLoad() {
       super.viewDidLoad()
   }

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

   @IBAction func Save(sender: AnyObject) {
       delegate!.showLabel() // call the method from delegate
   }
}

2 - 将代表设置为prepareForSegue

class ViewController: UIViewController {

   @IBOutlet weak var myLabel: UILabel!

   override func viewDidLoad() {
       super.viewDidLoad()
       myLabel.hidden = true

   }

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

   func showLabel(){
       myLabel.hidden = false
   }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let viewController = segue.destinationViewController as? SecondViewController {
            viewController.delegate = self
        }
    }

}

答案 2 :(得分:0)

这是因为你的标签“myLabel”总是为零。 您的标签是第一个ViewController的一部分。视图加载时标签会加载。由于ViewController视图尚未加载,因此标签也未加载,因此将为nil

答案 3 :(得分:-1)

只需在函数前添加类:

class Math{

    class func addition(numberOne: Int, numberTwo: Int) -> Int{

        var ans: Int = numberOne + numberTwo
        return ans
    }
}

然后你可以从另一个Swift类中调用它:

Math.addition(40, numberTwo: 2)

将其分配给变量i:

let i = Math.addition(40, numberTwo: 2) // -> 42