【问题标题】:How to set @IBOutlet text from a Class method如何从 Class 方法设置 @IBOutlet 文本
【发布时间】:2016-02-01 17:54:05
【问题描述】:

我有一个名为Sentence 的类,我想在ViewControllerSentence 方法之一中设置@IBOutlettext 属性。那可能吗?如果没有,在 Sentence 类方法本身中,我如何进行调用或设置我的 @IBOutlet 类方法中的文本的函数?

这是我的UILabel

@IBOutlet weak var kleinGrossLabel: UILabel!

【问题讨论】:

  • @MikeG 这并没有解决这个问题提出的任何问题,例如如何正确设置无法直接访问 kleinGrossLabel 的类中的文本。
  • @WillM。我误读了问题,谢谢提醒

标签: ios swift uilabel iboutlet


【解决方案1】:

您不能在另一个类的类方法中从UIViewController 分配IBOutlet。其他类(在您的情况下为 Sentence)应该如何了解视图控制器?

你有几个选择:

  1. Sentence 对象中保留对视图控制器的引用。
  2. 使用委托:在您的Sentence 实例上设置一个指向视图控制器的委托,并让其中一种协议方法访问IBOutlet 的内容。
  3. 使用NSNotificationCenter 从您的视图控制器正在侦听的Sentence 对象触发通知,并且可以直接更新其IBOutlet

【讨论】:

  • 感谢日航。以下哪三个是最佳实践?或者,如果等效,您个人会使用哪个?
  • “最佳实践”问题通常不适合 Stack Overflow,因为它们主要基于意见。这一切都是为了找到最适合您的应用程序架构的选项。委托是 iOS 编程中的一种流行模式,尽管通知可能是最容易使用的。我不建议保留参考(选项 1)。
【解决方案2】:

紧密耦合是指像Sentence 这样的类对其关注范围之外的事物(例如视图控制器的出口)承担责任。

这些类型的更改很难追踪,因为状态更改的位置并不明显。

虽然您可以通过使用委托或通知来松散耦合Sentence,但对于(单元或 UI)测试以及支持和维护您的代码,当一个类(in)直接影响时,它仍然会变得更加困难另一个类的状态。

另一种方式

您可以通过为Sentence 提供一个返回所需属性的公共方法来将此责任移出Sentence

通过像这样建立清晰的接口边界,它可以让您的代码更加模块化,让您可以更改 Sentence 的实现或视图控制器的出口,而不会影响其他类中的某些内容。

它还允许视图控制器(从 MVC 角度)单独负责更改视图的文本属性。

现在,从视图控制器中,您可以调用句子实例的公共方法,然后根据返回值设置视图控制器的 IBOutlet 文本属性。这将使文本更改的位置和原因变得显而易见,而不是将更改隐藏在另一个(类的)方法中。

【讨论】:

  • 如果视图控制器知道何时从 Sentence 类中提取更新的信息,这是正确的方法。但是,如果视图控制器需要将信息推送给它,那么 JAL 的解决方案是正确的。视情况而定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多