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

时间:2015-06-01 14:41:11

标签: ios swift oop model-view-controller uilabel

我有一个Model类,它有两个方法:

"dependencies": {
  "paper": "paperjs/paper.js#v0.9.22"
}

一个Controller类,它有一个按钮和一个标签。在Controller类中,我试图在Model类上调用methodes,并在标签上显示名为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 } 的输出。

label

但是我在这一行的Model类中遇到错误:@IBAction func Button(sender: UIButton) { modelFrom.changeLabel() modelFrom.callElements() }

  

在解包可选值时意外发现nil

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

或者协议/代表可能是更好的解决方案吗?

1 个答案:

答案 0 :(得分:3)

您的错误在这里

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您的标签中:

  3. 将属性保留为Label的文本,然后在属性更新时更新标签

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

    然后

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