2017-06-04 45 views
1

我试图用不同类中检索到的数据更新UILabel,因此在ViewDidLoad中,我调用了该不同类中的方法,然后在该类中,在ViewController中调用一个方法来更新UILabel。下面是我试图运行的代码的简化版本:无法在不同类中调用不同方法后更改UILabel

import UIKit 

    class ViewController: UIViewController { 

    @IBOutlet var label: UILabel! 
    override func viewDidLoad() { 
    super.viewDidLoad()   
    test().runTest() 
} 

func print() { 
    label.text = "test123" 
} 

} 

和其他类:

import UIKit 

class test: UIView { 

    func runTest() { 
     ViewController().print() 
    } 
} 

我不断收到话说打印到控制台上的错误消息:“致命错误:意外地发现零,而 “关于

而一个错误” label.text = “test123” 展开可选的值(LLDB)说: “线程1:EXC_Bad_Instruction(代码= EXC_(386_INVOP,子码=为0x0)”

预先感谢您的帮助。

+0

您是否将插座连接到故事板中的标签? – StevenOjo

+1

在你的'runTest'函数中,你正在创建视图控制器的一个新实例,并且你没有参考故事板就这么做,所以标签出口是零。当您调用视图控制器实例时,可以将视图控制器实例传递给'runTest',或者,最好让'runTest'返回值并让视图控制器本身负责更新其标签。这是一个糟糕的设计,有一个类更新其他类视图 – Paulw11

+0

你如何组织你的视图控制器,我可能也建议重命名你的功能。 – joshLor

回答

0
Your label IBOutlet is nil because you are creating a new viewcontroller instance and your viewcontroller is not attached any story board. you can pass self to  func runTest() and on self you can call print. Hope it will help! 

You can use this 

import UIKit 

    class ViewController: UIViewController { 

    @IBOutlet var label: UILabel! 
    override func viewDidLoad() { 
    super.viewDidLoad()   
    test().runTest(self) 
} 

func print() { 
    label.text = "test123" 
} 

} 

import UIKit 

class test: UIView { 

    func runTest(controller:ViewController) { 
     controller.print() 
    } 
} 
+0

完美!它现在有效。谢谢! – Mark

0

你的问题是,你正在你的视图控制器的新实例上运行的功能,而你应该在已经创建的实例上运行它。例如,如果你的视图是你的视图控制器的孩子,你可以这样做,在你的类test替换编辑你的功能测试是这个。

func runTest() { 
    if let vc = self.parent as? ViewController{ 
     vc.print() 
    } 
} 

这应该在已经创建的视图控制器实例上运行该函数。

相关问题