我想使用 Swift 更新 iOS 上用户界面元素的 title
属性。在这种情况下,它是一个UIBarButton,但它可以是UILabel,UIButton或其他任何东西。目前我正在使用此代码,它适用于:
func setStatusMessage(barButton: UIBarButtonItem) {
let currentVersion = StatusModel.getCurrentVersion()
var statusUpdates = [StatusModel]()
var statusForCurrentVersion: StatusModel!
var statusMessage = String()
// check if update required before setting the text
checkIfLocalStatusNeedsUpdate()
barButton.title = getLocalStatusMessage()
// Try to update status anyway...
getStatusFromRemoteSource { (statusUpdates) -> Void in
for status in statusUpdates {
if status.version == currentVersion {
statusForCurrentVersion = status
}
}
self.saveStatusFromRemoteSource(statusForCurrentVersion)
barButton.title = statusForCurrentVersion.message
}
}
虽然有效,但这个解决方案也很丑陋,因为它确实需要在我的模型中嵌入用户界面(视图)元素。不完全是一种MVC美女.....
我不能简单地使用return
因为在获取远程状态之前将返回本地状态。所以我想我需要某种处理程序/侦听器/委托(/*getting lost here*/
)来动态更新视图。在这种情况下,这意味着:使用本地存储的值设置标题,并在收到远程值时更新它。
以符合 MVC 的方式处理此方案,从模型代码中删除 UI 元素(从而提高可重用性)的最佳方法是什么?
您可以执行的一个中间步骤是通过将 barButton 参数替换为对控制器的引用来将控制器转到 UI。
barButton.title = statusForCurrentVersion.message
->
self.controller.update(title: statusForCurrentVersion.message)
这样,您的代码就可以增长(更新更多标签等),但它会带来更多代码和更难阅读的成本。