0

这是情况。我有一个协议,以及它的扩展。

protocol CustomViewAddable {
    var aView: UIView { get }
    var bView: UIView { get }
    func setupCustomView()
}
extension CustomViewAddable where Self: UIViewController {
    var aView: UIView {
        let _aView = UIView()
        _aView.frame = self.view.bounds
        _aView.backgroundColor = .grey
        // this is for me to observe how many times this aView init. 
        print("aView: \(_aView)")
        return _aView
    }
    var bView: UIView {
        let _bView = UIView(frame: CGRect(x: 30, y: 30, width: 30, height: 30))
        _bView.backgroundColor = .yellow
        return _bView
    }
    func setupCustomView() {
        view.addSubview(aView);
        aView.addSubview(bView);
    }
}

我制作了一个 ViewController 来符合这个协议,然后我将这个自定义的“aView”添加到我的 ViewController 的视图中。

class MyVC: UIViewController, CustomViewAddable {
    override func viewDidLoad() {
        super.viewDidLoad()

        setupCustomView()
    }
}

我运行它。在我的控制台日志中,它打印了两次 init,我试图在我的自定义“aView”中做某事,但它失败了。(我在上面粘贴的代码进行了简化,以便很容易地表达我的意图)

任何人都可以解释原因或对其进行修复,我将不胜感激。

4

2 回答 2

1

因为您var aView: UIView是计算变量而不是存储变量,

所以每次你调用aView,它都会创建一个新的UIView

您可以Associated ObjectsNSObject这里使用一些教程:

希望这可能会有所帮助。

于 2017-01-13T03:44:30.563 回答
1

基本上,在您实现该setupCustomView方法的方式中,没有什么应该起作用,因为正如在另一个响应中提到的那样,您正在使用计算属性,因此这意味着每次访问该属性时都会再次创建它。

你不需要使用关联对象或类似的东西来实现你想要的,你只需要aView在开始时保持引用避免再次调用它,这样:

func setupCustomView() {
   let tView = aView // only is computed once
   view.addSubview(tView)
   tView.addSubview(bView)
}

我希望这对你有帮助。

于 2017-01-13T05:18:20.660 回答