MVC 通信,从 Swift 中的模型 class 更新标签

MVC communication, update label from model class in Swift

我有一个模型 class,它有两种方法:

func callElements() -> String {
    if(count < elementsToShow.count - 1) {
        count += 1
        var element = elementsToShow[count]
        println(element)
        return element
    } else {
        return "No more buttons"
    }
}

func changeLabel(){
    var callV = ViewController().label
    var elementCall = callElements()
    println("111")
    callV.text = elementCall // in this line I am having and error saying: unexpectedly found nil while unwrapping an Optional value
}

还有一个控制器 class,它有一个按钮和一个标签。从控制器 class 我试图在模型 class 上调用方法并在名为 label.

的标签上显示输出
@IBAction func Button(sender: UIButton) {
    modelFrom.changeLabel()
    modelFrom.callElements()     
}

但我在模型 class 的这一行中遇到错误:callV.text = elementCall

unexpectedly found nil while unwrapping an Optional value

我需要这些方法在模型 class 中,因为相同的标签需要从其他控制器 classes 更改(当在其他 classes 中单击其他按钮时)。这只是一个简单的想法,因为我需要在更复杂的应用程序中实现这个想法。

或者 protocols/delegates 是更好的解决方案?

你的错误在这里

var callV = ViewController().label

您正在创建 ViewController 的新实例,您应该获取现有实例的引用

你可以传入一个标签作为输入

func changeLabel(label:UILabel){
var elementCall = callElements()
println("111")
label.text = elementCall 
}

然后打电话

modelFrom.callElements(self.label)

更新: 我建议你更好的设计

  1. 这是你的逻辑函数Model(好吧,我不认为这是模型部分)

    func callElements() -> String {
        if(count < elementsToShow.count - 1) {
        count += 1
        var element = elementsToShow[count]
        println(element)
        return element
    } else {
        return "No more buttons"
    

    } }

  2. viewController你的标签中:

保留一个属性作为Label的文本,然后属性更新时,更新标签

 var labelText:String?{
    didSet{
        label.text = labelText
    }
}

然后

@IBAction func Button(sender: UIButton) {
   labelText = modelFrom.changeLabel()
}
  1. 然后在第二个视图控制器中,如果当第二个视图控制器在屏幕上时您的第一个视图控制器不可见。您只需将新值传回 labelText。这是关于 在 ViewControllers 之间传递值,如果你使用故事板,你可以使用委托或协议将值传回