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 が 2 回出力され、カスタム 'aView' で何かをしようとして失敗しました。(上に貼り付けたコードは、意図を示すのが非常に簡単になるように単純化したものです)

誰かが理由を説明したり、修正したりしていただければ幸いです。

4

2 に答える 2

1

あなたvar aView: UIViewはストア変数ではなく計算変数なので、

したがって、 を呼び出すたびにaView、新しい が作成されますUIView

Associated Objectsここで使用できるNSObjectチュートリアルは次のとおりです。

これが役立つことを願っています。

于 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 に答える