2017-06-04 9 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)をアンラップしながら、不意に言ってはnilが見つかりました: "スレッド1:EXC_BAD_INSTRUCTION(コード= EXC_(386_INVOP、サブコード= 0x0の)"

ご協力いただきありがとうございます。

+0

ストーリーボードのラベルにコンセントを接続しましたか? – StevenOjo

+1

あなたの 'runTest'関数では、あなたのView Controllerの新しいインスタンスを作成しています。これは、ストーリーボードへの参照なしにそうしているので、ラベルアウトレットはゼロです。あなたがそれを呼び出すとき、ビューコントローラのインスタンスを 'runTest'に渡すか、' runTest'が値を返すようにし、ビューコントローラ自身がラベルの更新を担当するようにします。 1つのクラスで別のクラスビューを更新するようなデザインが貧弱です – Paulw11

+0

どのようにView Controllerを整理していますか、あなたの関数の名前を変更することをお勧めします。 – 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

あなたの問題は、ビューコントローラの新しいインスタンスで関数を実行していることです。むしろ、すでに作成されたインスタンスで関数を実行する必要があります。たとえば、ビューがView Controllerの子である場合は、これを行うことができます。クラス内でtestを置き換えて、関数テストをこれに置き換えます。

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

これは、既に作成されたビューコントローラのインスタンスで関数を実行する必要があります。

関連する問題