UIViewにxibファイルをロードする方法


111

私はあらゆる場所を検索してきましたが、今のところ何も役に立っていません。

基本的に、rootView.xibという.xibファイルを作成し、その中に画面の半分しか占めないUIView(containerViewと呼びます)を作成します(通常のビューと新しいビューがあります)。次に、firstView.xibという別の.xibファイルが必要で、それをcontainerView内にロードします。そのため、firstView.xibにたくさんのものを、rootView.xibにたくさんのさまざまなものを置き、rootView.xibのcontainerView内にfirstView.xibをロードできますが、画面の半分しか占めないので、 rootView.xib上のもの


2
このクエストは古風です。何年もの間、単にコンテナビューのチュートリアルを
Fattie

回答:


181

プログラムでxibファイルからオブジェクトを取得するには、次のコマンドを使用できます。[[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil]これは、xibの最上位オブジェクトの配列を返します。

だから、あなたこのようなことをすることができます:

UIView *rootView = [[[NSBundle mainBundle] loadNibNamed:@"MyRootView" owner:self options:nil] objectAtIndex:0];
UIView *containerView = [[[NSBundle mainBundle] loadNibNamed:@"MyContainerView" owner:self options:nil] lastObject];
[rootView addSubview:containerView];
[self.view addSubview:rootView];

@PaulSolt sirこの質問に関連するクエリがあります。スライドメニューとしてxibのサブビューを開きます。ビューコントローラーのメニューボタンをクリックすると、サブビュー(xibの半分の画面)だけがスライドします。できれば助けてください。
sandeep tomar 2016年

(nilと表示)thisView.alpha = 0では機能しません thisView.superview
Jack

24

別の.xibファイル内の.xibファイルからUIViewをロードするために、githubにサンプルプロジェクトを作成しました。または、プログラムで行うこともできます。

これは、さまざまなUIViewControllerオブジェクトで再利用する小さなウィジェットに適しています。

  1. 新しいアプローチ:https : //github.com/PaulSolt/CustomUIView
  2. オリジナルのアプローチ:https : //github.com/PaulSolt/CompositeXib

.xibファイルからカスタムUIViewをロードする


素晴らしいlib、素晴らしい作品!まだ自分で使っていますか?:)
AnthoPak

コーヒーレシピの開始時に、BrewCoffeeApp.comでカスタムビューのストーリーボードとXIBファイルを使用してこの読み込み手法を使用します。
ポールソルト

21

あなたは試すことができます:

UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];

それは正確にあなたが提案したものではありません。彼は、「rootView.xib」は「containerView」という名前の画面の半分のサイズのsubViewを持つだろうと述べました。そして、containerViewに彼のnib "firstView.xib"のコンテンツをロードしたかったのです。
NJones、2011年

19

【迅速実装】

xibからビューをロードする一般的な方法:

例:

let myView = Bundle.loadView(fromNib: "MyView", withType: MyView.self)

実装:

extension Bundle {

    static func loadView<T>(fromNib name: String, withType type: T.Type) -> T {
        if let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T {
            return view
        }

        fatalError("Could not load view with type " + String(describing: type))
    }
}

1
最新のSwiftによると:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen

6

XIBファイルを作成します。

ファイル->新しいファイル-> ios-> cocoa touchクラス->次へ

ここに画像の説明を入力してください

「XIBファイルも作成する」にチェックマークを付けてください

と一緒に演奏したい tableviewので、サブクラスを選択しましたUITableViewCell

あなたの必要条件として選択することができます

ここに画像の説明を入力してください

希望どおりのXIBファイル(RestaurantTableViewCell.xib)

ここに画像の説明を入力してください

各行の高さをテーブルに設定するには、行の高さをつかむ必要があります

ここに画像の説明を入力してください

さあ!それらを迅速にファイルをハックする必要があります。私はhuckedていますrestaurantPhotoし、restaurantNameあなたはあなたのすべてをハックすることができます。

ここに画像の説明を入力してください

今UITableViewを追加しています

ここに画像の説明を入力してください

名前
nibファイルの名前。拡張子.nibを含める必要はありません。

オーナー
nibのファイルの所有者オブジェクトとして割り当てるオブジェクト。

オプション
nibファイルを開くときに使用するオプションを含む辞書。

最初に 定義していない場合は、最初にすべてのビューを取得するため、そのセット内の1つのビューを取得する必要がありますfrist

Bundle.main.loadNibNamed("yourUIView", owner: self, options: nil)?.first as! yourUIView

ここにテーブルビューコントローラのフルコードがあります

import UIKit

class RestaurantTableViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let restaurantTableviewCell = Bundle.main.loadNibNamed("RestaurantTableViewCell", owner: self, options: nil)?.first as! RestaurantTableViewCell

        restaurantTableviewCell.restaurantPhoto.image = UIImage(named: "image1")
        restaurantTableviewCell.restaurantName.text = "KFC Chicken"

        return restaurantTableviewCell
    }
   // set row height
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 150
    }

}

あなたがやった:)

ここに画像の説明を入力してください


1
教えてください。なぜ反対票を投じたので私は喜ぶ
Nazmul Hasan

6
あなたの例は、xibの読み込みからのビューには問題ありません。しかし、のtableViewのためにそれは間違っている-再利用可能なセルされ、正しい方法
ヴィクトル

4

Swift 3&4の場合

let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as? CustomView

2

スウィフト4.2

NibViewという名前のクラスがあり、関連するnibファイルがNibView.xibであるとしましょう

class NibView: UIView {

    class func getScreen() -> NibView {
        let xib = Bundle.main.loadNibNamed(String(describing :self), owner: self, options: nil)
        let me = xib![0] as! NibView
        return me
    }

}

クラスのインスタンスを作成し、必要に応じて特定のレイアウトでビューに追加します

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.