【发布时间】:2021-01-05 03:54:54
【问题描述】:
我需要移动一个用于在扩展中添加和删除日志视图的方法,以便将它提供给每个控制器。为此,我在原始方法中添加了一个 inout UIVew 参数,其中我为视图使用了一个全局变量。不,我有这个错误
“UIViewController”类型的值没有成员“containerForLoading”
从self.containerForLoading 中删除 self 会报错:
转义闭包捕获'inout'参数'containerForLoading'
在动画闭包内(见评论) 是整个过程都错了还是我在最后一步迷路了?
extension UIViewController {
func showLoadingView(containerForLoading: inout UIView, uponView: UIView) {
containerForLoading = UIView(frame: uponView.bounds)
uponView.addSubview(containerForLoading)
containerForLoading.backgroundColor = .white
containerForLoading.alpha = 0
UIView.animate(withDuration: 0.24) { self.containerForLoading.alpha = 0.8 } //here the error
let activivityIndicator = UIActivityIndicatorView()
containerForLoading.addSubview(activivityIndicator)
activivityIndicator.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
activivityIndicator.centerYAnchor.constraint(equalTo: uponView.centerYAnchor),
activivityIndicator.centerXAnchor.constraint(equalTo: uponView.centerXAnchor)
])
activivityIndicator.startAnimating()
}
func removeLoading(containerForLoading: inout UiView, uponView: UIView) {
containerForLoading.removeFromSuperview()
}
}
这是原始视图控制器中的代码
使用这个变量
var containerForLoading = UIView()
在需要时以这种方式调用
self.showLoadingView(uponView: self.view)
extension ViewController {
func showLoadingView(uponView: UIView) {
containerForLoading = UIView(frame: uponView.bounds)
uponView.addSubview(containerForLoading)
containerForLoading.backgroundColor = .white
containerForLoading.alpha = 0
UIView.animate(withDuration: 0.24) { self.containerForLoading.alpha = 0.8 }
let activivityIndicator = UIActivityIndicatorView()
containerForLoading.addSubview(activivityIndicator)
activivityIndicator.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
activivityIndicator.centerYAnchor.constraint(equalTo: uponView.centerYAnchor),
activivityIndicator.centerXAnchor.constraint(equalTo: uponView.centerXAnchor)
])
activivityIndicator.startAnimating()
}
func removeLoading(uponView: UIView) {
containerForLoading.removeFromSuperview()
}
}
【问题讨论】:
-
self.containerForLoading.alpha在extension UIViewController {}内调用,因此它期望它是UIViewController的属性。事实并非如此。你的意思是`containerForLoading.alpha`,因为它是你想要的前一个变量。 -
但无法删除 self 否则我得到 Escapingclosure captures 'inout' parameter 'containerForLoading' 错误
-
您能否展示您的代码在 放入扩展程序之前是什么样的?
-
用旧代码更新,除了inout新参数外基本相同
标签: ios swift extension-methods inout