2017-11-29 4 views
0

私は、開発者がそのようなのViewControllerのビュープロパティに自分のメインビューを割り当てるチュートリアルを見てきたので、私はiOSのプログラミングのいずれかのあいまいさの意味を理解しようとしている:iOSでは、ビューをサブビューとして追加するとビューをビュープロパティに割り当てることに違いがありますか?

let sceneView = ARSCNView(frame: self.view.frame) 
view = sceneView 

私も見てきましたが開発者はメインビューをサブビューとしてビュープロパティに追加します。

let sceneView = ARSCNView(frame: self.view.frame) 
view.addSubView(sceneView) 

これらの2つのプロセスは同じですか?

答えて

5

これらは同一ではありませんが機能的には類似しています。ここでの違いのデモです:

デバッガで
override func viewDidLoad() { 
    super.viewDidLoad() 

    self.view.backgroundColor = UIColor.blue 
    let sceneView = UIView(frame: self.view.frame) 
    sceneView.backgroundColor = UIColor.red 
    self.view.addSubview(sceneView) 
} 

subview

は交換と比較:

デバッガで
override func viewDidLoad() { 
    super.viewDidLoad() 

    self.view.backgroundColor = UIColor.blue 
    let sceneView = UIView(frame: self.view.frame) 
    sceneView.backgroundColor = UIColor.red 
    self.view = sceneView 
} 

subview

これは、サブビューによって隠されていますが、sceneViewがサブビューとして追加されても、元の青いビューはビュー階層内にあることがわかります。ただし、ビューを置き換えると、元の青いビューはもはやビュー階層の一部になりません。

注:viewDidLoad()をrmaddyに置き換えるのではなく、loadView()でビューを設定したい場合は、このようなものが動作するはずです。そのトリックは適切なフレームを取得しています。たとえば、ナビゲーションコントローラの場合、フレームは異なります。

override func loadView() { 
    let sceneView = UIView(frame: UIScreen.main.bounds) 
    sceneView.backgroundColor = UIColor.red 
    self.view = sceneView 
} 
+0

これは意味を成していますが、どちらのプロセスがより良い方法ですか、あるいはこのプロセスが開発者としての私の心配の中で最小限に抑えるべきでしょうか? –

+1

正直なところ、どちらにしても大したことではありません。技術的にビューを自分のビューに置き換えると、ビューの階層が単純になりますので、私は一般的にそのアプローチを推奨しますが、Appleには公式の姿勢があることはわかりません。 –

+3

'viewDidLoad'に' view'を再割り当てしないでください。 'view'プロパティにカスタムビューを割り当てる場合は、' loadView'をオーバーライドしてそれを行います。 – rmaddy

関連する問題