2016-11-12 6 views
0

初めてnibファイルを使用しています。私はxibと対応する迅速なクラスを意味します。Xcode - IBOutletsとNibファイルの仕組みは?

import UIKit 

@IBDesignable class LittleVideoView: UIView { 

    var view: UIView! 

    var nibName: String = "LittleVideoView" 

    // MARK: Views 
    @IBOutlet weak var titleLabel: UILabel! 
    @IBOutlet weak var clicksLabel: UILabel! 
    @IBOutlet weak var channelNameLabel: UILabel! 
    @IBOutlet weak var thumbnailImageView: UIImageView! 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setup() 
    } 

    func setup() { 
     view = loadViewFromNib() 
     view.frame = bounds 
     view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] 
     addSubview(view) 
    } 

    func loadViewFromNib() -> UIView { 
     let bundle = NSBundle(forClass: self.dynamicType) 
     let nib = UINib(nibName: nibName, bundle: bundle) 
     let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView 
     return view 
    } 
} 

あなたが見ることができるように、私はいくつかのIBOutletsを作成し、エディタビューから:

は、ここに私の迅速なクラスです。すべて正常に動作します。

私には理解できないことがあります。私はこのクラスのペン先をプログラムでロードしています。なぜ、Xcodeが本当に正しいnibファイルをロードするかわからないうちにIBOutletsを作成するのはなぜですか?まもなく、私はIBOutletがこの場合どのように動作するのか理解していません。だから、XcodeはIBOutletsとsetup()メソッドのロードされたUIViewをどうやってリンクしますか?

+0

これが知りたいのために不合理なことではありませんが、それ_again_を依頼する必要はありません。ここで何度も説明されています。 – matt

答えて

2

Nibファイルには、使用可能なアウトレットとアクションをリストするためにエディタが使用する「ファイルの所有者」タイプがあります。しかし、実行時にペン先が読み込まれると、その型は強制されません。アウトレットは、instantiateWithOwnerに渡された「所有者」がペン先で定義されているコンセントバインディングと互換性があると仮定して、-setValue:forKey:を使用して接続されます。

One xib File with Multiple "File's Owner"s

If you have an IBOutlet, but not a property, is it retained or not?

+0

ありがとう、私は "instantiateWithOwner"について忘れています:) – NathanVss