【发布时间】:2019-01-21 15:44:10
【问题描述】:
我有 UIViewController 的这个沉重的 basicVC 类子类,我正在尝试将其转换为 vcprotocol。
BasicVC 像上帝一样做所有工作。我想作为 vcProtocol 闯入其中。
我正在尝试做的是关注点分离。并非所有 ViewController 都需要显示警报视图或网络未连接消息。
例如,我有在协议扩展中创建的指标视图作为计算属性。没有错误警告,但没有显示任何指示符。当我尝试调试并执行po acticvityIndicator 时,我收到以下错误,这表明从未分配过activityIndicator。
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x5a1012de027).
The process has been returned to the state before expression evaluation.
代码sn-p:
protocol vcProtocol {
var activityIndicator: UIActivityIndicatorView { get }
}
协议扩展:
extension vcProtocol where Self: UIViewController {
var activityIndicator: UIActivityIndicatorView {
let indicator = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.gray)
indicator.hidesWhenStopped = true
indicator.style = .whiteLarge
indicator.color = .red
indicator.backgroundColor = UIColor.gray
indicator.translatesAutoresizingMaskIntoConstraints = false
return indicator
}
func showLoadingIndicator() {
activityIndicator.startAnimating()
activityIndicator.isHidden = false
}
func hideLoadingIndicator() {
activityIndicator.stopAnimating()
activityIndicator.isHidden = true
}
}
我不知道如何解决这个问题。因为我只能在协议中具有计算属性。 所以我将它们作为仅获取属性。 我的计划是使用协议扩展来提供默认实现。
关于如何解决这个问题的任何想法。
【问题讨论】:
-
不确定是否相关,但您是否随时将此
activityIndicator添加为subView? -
你的活动指示器视图是一个计算属性,所以每次你引用它时,你都会得到一个新的!
-
@rob 我不明白。因此错误。至少这是我的假设
-
EXC_BAD_ACCESSinpo并不意味着属性是nil,它发生在协议扩展中定义的属性的情况下,您可以在扩展中添加断点并对其进行验证。您应该在使用它的地方添加代码。
标签: swift swift-protocols protocol-oriented