2017-06-13 52 views
0

我想從ViewController中調用標籤並將其設置在代碼中的不同位置,例如有2個不同的函數,它們都將標籤設置爲可以說「喜」和第2個功能將其設置爲‘你好’Swift協議沒有設置標籤值,也沒有

我用Swift3協議的方式就像這樣:Access label.text from separate class in swift

我在班上另一個初始化,所以我不知道爲什麼它不會設置標籤文字到新的值,但是無。

我首先點擊連接按鈕。

這裏是我的代碼:

protocol HiResponder: class { 
    func hi() 
    func hello() 
} 

class ViewController: UIViewController, HiResponder { 

@IBOutlet weak var status: UILabel! 
var test: Test! 

override func viewDidLoad() { 
     super.viewDidLoad() 

test.responder = self //gives me nil fatal error: unexpectedly found nil while unwrapping an Optional value 
} 

@IBAction func connectBtn(_ sender: Any) { 
     self.test = Test(
      p1: "hey", 
      p2: "there" 
     ) 
     self.test.connect(p1: "hey", p2: "there") 
    } 

func hi() { 
     status.text = "hi" 
    } 
    hello() { 
     status.text = "hello" 
    } 

} 

這是設置這些反應的價值類:我想概括我的代碼

class Test { 

    var test:TestQQ? 
    var p1:String? 
    var p2: String? 

weak var responder: HiResponder? 

init(p1: String, p2:String) { 
    self.p1 = p1 
    self.p2 = p2 
} 

init(responder: TestResponder) { 
    self.responder = responder 
} 

// Connect 
func connect(p1:String, p2:String) { 
     //code 
} 

func setHello(){ 
    responder?.hello() 
} 


func setHi(){ 
    responder?.hi() 
} 

} 

但多數民衆贊成這個想法。我的連接功能正在我viewDidload的viewController被調用。

+0

您是否在任何地方設置了responder?您顯示的代碼不會分配「Test」實例並存在其他問題。可以簡化代碼,但應確保代碼是有效的[MCVE],否則我們正在解決示例中的問題,而不是實際的代碼。 – Paulw11

+0

@ Paulw11我沒有在任何地方設置響應者。但我怎麼能?我在哪裏? – fscore

+0

這就是代表團模式的工作原理;當你在你的'ViewController'中創建'Test'的實例時,你設置了'test.responder = self',所以現在'Test'實例有一個引用返回到視圖控制器。 – Paulw11

回答

0

您沒有實例化測試。由於viewdidload會先運行,當然是零。因此,你無法從中取得任何東西。你需要做的是找到一個地方,在你使用它之前先實例化它。也許在connectBTN中,您可以在創建後設置響應者,而不是在viewdidload中。

0

處理解包的nil可選值的解決方案是將test設置爲可選Test對象。

但還有一個問題。你永遠不會使用協議中的任何一個功能。嗨()或你好()

下面我使用協議的兩個功能,但不是從另一個類。事實上,我根本沒有使用測試。不確定你的目標是使用不同的類來設置標籤文本。

protocol HiResponder: class { 
    func hi() 
    func hello() 
} 

class ViewController: UIViewController, HiResponder { 

    @IBOutlet weak var status: UILabel! 
    var num = 1 
    var test: Test? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     test?.responder = self //gives me nil fatal error: unexpectedly found nil while unwrapping an Optional value 
    } 

    @IBAction func connectBtn(_ sender: Any) { 
     if num % 2 == 0 { 
      hi() 
     } else { 
      hello() 
     } 
     num += 1 
    } 

    func hi() { 
     status.text = "hi" 
    } 

    func hello() { 
     status.text = "hello" 
    } 
} 

class Test { 

    var test: Test? 
    var p1: String? 
    var p2: String? 

    weak var responder: HiResponder? 

    init(p1: String, p2:String) { 
     self.p1 = p1 
     self.p2 = p2 
    } 

    init(responder: HiResponder) { 
     self.responder = responder 
    } 

    // Connect 
    func connect(p1:String, p2:String) { 
     //code 
    } 

    func setHello(){ 
     responder?.hello() 
    } 

    func setHi(){ 
     responder?.hi() 
    } 
}