我有一个名为Sentence
的课程,我想在text
的{{1}} @IBOutlet
中使用ViewController
的一种方法设置Sentence
属性}。那可能吗?如果没有,在Sentence
类方法本身内,如何进行调用或从类方法设置@IBOutlet
文本的函数?
这是我的UILabel
@IBOutlet weak var kleinGrossLabel: UILabel!
答案 0 :(得分:5)
您无法在另一个类的类方法中从IBOutlet
分配UIViewController
。那个其他类(在你的情况下是Sentence
)应该如何知道视图控制器?
您有几个选择:
Sentence
对象中保留对视图控制器的引用。Sentence
实例上设置指向视图控制器的委托,并让其中一种协议方法访问IBOutlet
的内容。NSNotificationCenter
从您的视图控制器正在侦听的Sentence
对象发出通知,并可以直接更新其IBOutlet
。答案 1 :(得分:3)
当像Sentence
这样的类承担对其关注之外的事情负责时,例如视图控制器的出口,就会出现紧耦合。
这些类型的更改很难追查,因为状态发生变化并不明显。
虽然你可以通过使用委托或通知松散地耦合Sentence
,但是当一个类(in)时,它(或单元或UI)测试以及支持和维护代码仍然会变得更加困难直接影响另一个阶级的状态。
另一种方式
您可以通过为Sentence
提供返回所需属性的公共方法,将此责任移出Sentence
。
通过建立这样的清晰界面边界,它允许您的代码更加模块化,让您可以更改Sentence的实现或视图控制器的出口,而不会影响其他类中的某些内容。
它还允许视图控制器(从MVC角度来看)单独负责更改视图的文本属性。
现在,从视图控制器中,您可以调用句子实例的公共方法,然后根据返回的值设置视图控制器的IBOutlet文本属性。这将明显改变文本的位置和原因,而不是将该更改隐藏在另一个(类的)方法中。