2017-06-13 61 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() 
    } 
}