我有两个视图控制器。 我在第一个视图控制器中有一个测试方法,如下所示
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调用它,那么我就会出错。
答案 0 :(得分:0)
你的视图控制器都使用storyboard / xib;当您在代码中创建这样的视图控制器实例时(就像在\CMS\CMSModules\Content\CMSDesk\Properties\Advanced\EditableContent\Main.aspx.cs
函数中一样),您需要使用Save
类或UINib
类instantiateViewControllerWithIdentifier
方法,因为默认初始值设定项(如您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