2017-03-20 12 views
0

レイアウト用に.xibファイルを使用してカスタムビューを作成しました。私はプログラム的に作成し、別のビューにサブビューとしてこのビューを追加したいと思います。プログラムで別のビューにカスタムビューを追加する

サブビュークラス:

class Subview: UIView { 

@IBOutlet var view: UIView! 
@IBOutlet var titleLabel: UILabel! 
@IBOutlet var textLabel: UILabel! 

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

    Bundle.main.loadNibNamed("Subview", owner: self, options: nil) 
    self.addSubview(view) 
    view.frame = self.bounds 
    } 
} 

私はそれについて移動するかどうかはわかりません、唯一のコンストラクタは、現在私が持っていないNSCoderのインスタンスを期待しています。

私はそれに追加の初期化子与えることを試みた。その後、

init(title: String, text: String) { 
    titleLabel.text = title 
    textLabel.text = text 
    super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
} 

そして、それを呼び出す:

let v = Subview(title: dataSource[i].whatever, text: dataSource[i].bla) 

をしかし、ラベルアウトレットをアンラップしようとすると、それが失敗した、と理にかなっています.xibは初期化されていません。

私はすでに、ページのUIをプログラマチックに構築するのではなく、テーブルビューとカスタムセルを使用しようとしましたが、これは詳細ページであり、データソースとしてrowForIndexPathテーブルビューデリゲートが予期する配列。オブジェクトの配列にプロパティを変換するマッパーメソッドを書くことができますが、できるだけ避けることをお勧めします。

ありがとうございました。

+0

nibの初期化が割り当てられていないので、コンセントが初期化されていないので、 'self = Bundle.main.loadNibNamed(" Subview "、owner:self、options:nil)?[0 ] ' – iphonic

+0

look ..http://stackoverflow.com/a/33946855/4003548。 – vaibhav

+0

https://stackoverflow.com/questions/35659714/loading-a-xib-file-to-a-uiview-swift/35666644#35666644これは役に立ちます。 –

答えて

1

1)Subview.xibに移動して、ファイルの所有者が空のままになっていることを確認します。

enter image description here

また、あなたのビューのためのクラスがSubviewとして選択されていることを確認してください。

enter image description here

2)はそう、初期化子を取り除く:

class Subview: UIView { 

    @IBOutlet var view: UIView! 
    @IBOutlet var titleLabel: UILabel! 
    @IBOutlet var textLabel: UILabel! 

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

     Bundle.main.loadNibNamed("Subview", owner: self, options: nil) 
     self.addSubview(view) 
     view.frame = self.bounds 
    } 
} 

は次のようになります。

class Subview: UIView { 

    @IBOutlet var view: UIView! 
    @IBOutlet var titleLabel: UILabel! 
    @IBOutlet var textLabel: UILabel! 
} 

3)あなたがこの方法を表示初期化します。

let view = UINib(nibName: "Subview", bundle: nil).instantiate(withOwner: nil, options: nil).first as! Subview 

あなたもチェックアウトすることができます。

http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6

How to initialise a UIView Class with a xib file in Swift, iOS

幸運!

0

あなたがIBOutletsを処理する必要がある場合、私はあなたの代わりにUIViewののXIBの所有者としてのUIViewControllerを使用することをお勧め([ファイル]メニューからのUIViewControllerを作成するときにもXIBを作成するオプションがあります)

その後、 Swift: Add a xib into a UIView

0

で提案されているように一部、カスタムサブクラスは注意が必要です)親ビュー

var subviewController: SubviewController? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     subviewController = SubviewController(nibName: nil, bundle: nil) 

     self.view.addSubview(subviewController!.view) 

     //Remember to call the IBOutlets only after adding the view 
     subviewController!.titleLabel.text = "This is the title" 

     subviewController!.view.frame = self.view.frame //Not suggested 
     //Instead set constraints here 
    } 

にそれをあなたが(viewDidLayoutSubviewsを使用して、制約または終了を設定する必要がいずれかの方法をこの方法をインスタンス化することができます特にxibファイルを使用する場合。あなたが示したコードでは、どこが間違っているのかは明らかではありませんが、おそらくアウトレット接続が失われています。

ここでは、Interface Builderでカスタムクラスを使用するなど、Obj-CとSwiftのバージョンが含まれています。具体的にあなたが何をしようとしてために、Swift3/SW3LoadFromXIBの例を見て:

https://github.com/DonMag/IBDesignInspect

関連する問題