Swift协议没有设置标签值,也没有
问题描述:
我想从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被调用。
答
您没有实例化测试。由于viewdidload会先运行,当然是零。因此,你无法从中取得任何东西。你需要做的是找到一个地方,在你使用它之前先实例化它。也许在connectBTN中,您可以在创建后设置响应者,而不是在viewdidload中。
答
处理解包的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()
}
}
您是否在任何地方设置了responder?您显示的代码不会分配“Test”实例并存在其他问题。可以简化代码,但应确保代码是有效的[MCVE],否则我们正在解决示例中的问题,而不是实际的代码。 – Paulw11
@ Paulw11我没有在任何地方设置响应者。但我怎么能?我在哪里? – fscore
这就是代表团模式的工作原理;当你在你的'ViewController'中创建'Test'的实例时,你设置了'test.responder = self',所以现在'Test'实例有一个引用返回到视图控制器。 – Paulw11