webentwicklung-frage-antwort-db.com.de

So laden Sie eine xib-Datei in eine UIView

Ich habe überall gesucht und bisher hat nichts für mich funktioniert.

Grundsätzlich möchte ich eine .xib-Datei namens rootView.xib haben und darin möchte ich eine UIView (nennen wir es containerView) haben, die nur die Hälfte des Bildschirms einnimmt (es würde also die reguläre Ansicht und eine neue Ansicht geben). Dann möchte ich eine andere .xib-Datei namens firstView.xib und lade sie in containerView. Ich kann also ein paar Sachen in firstView.xib und ein paar andere Sachen in rootView.xib haben und mein firstView.xib in containerView in rootView.xib laden, aber da es nur die Hälfte des Bildschirms einnimmt, würden Sie immer noch das sehen Sachen auf rootView.xib

106
Matt

Um ein Objekt programmgesteuert aus einer xib-Datei abzurufen, können Sie Folgendes verwenden: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil], das ein Array der Objekte der obersten Ebene in der xib zurückgibt.

Also, Sie könnten so etwas machen:

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];
177
chown

Ich habe ein Beispielprojekt auf github erstellt, um ein UIView aus einer .xib-Datei in eine andere .xib-Datei zu laden. Oder Sie können es programmgesteuert tun.

Dies ist gut für kleine Widgets, die Sie auf verschiedenen UIViewController-Objekten wiederverwenden möchten.

  1. Neuer Ansatz: https://github.com/PaulSolt/CustomUIView
  2. Ursprünglicher Ansatz: https://github.com/PaulSolt/CompositeXib

Load a Custom UIView from .xib file

24
Paul Solt

Du könntest es versuchen:

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

[Schnelle Implementierung]

Universelle Art der Ladeansicht von xib:

Beispiel:

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

Implementierung:

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))
    }
}

Erstellt eine XIB-Datei:

Datei -> Neue Datei -> iOS-> Cocoa Touch-Klasse -> Weiter

enter image description here

stellen Sie sicher, dass das Häkchen "auch XIB-Datei erstellen" gesetzt ist.

Ich würde gerne mit tableview auftreten, also habe ich Unterklasse UITableViewCell gewählt

sie können als Ihre Anforderung wählen

enter image description here

XIB-Datei nach Ihren Wünschen (RestaurantTableViewCell.xib)

enter image description here

wir müssen die Zeilenhöhe ermitteln, um die Tabellenhöhe für jede Zeile zu bestimmen

enter image description here

Jetzt! müssen sie hucken Swift file. Ich bin hucked die restaurantPhoto und restaurantName Sie können Sie alle hucken.

enter image description here

Füge jetzt eine UITableView hinzu

enter image description here

Name
Der Name der NIB-Datei, die die NIB-Erweiterung nicht enthalten muss.

Besitzer
Das Objekt, das als Eigentümerobjekt der Nib-Datei zugewiesen werden soll.

Optionen
Ein Wörterbuch mit den Optionen zum Öffnen der NIB-Datei.

zuerst Wenn Sie nicht zuerst definieren, greifen Sie auf alle Ansichten zu. Sie müssen also eine Ansicht innerhalb dieses Satzes frist greifen.

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

hier ist der vollständige Code des Table-View-Controllers

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
    }

}

bist du fertig :)

enter image description here

5
Nazmul Hasan

Für Swift 3 & 4

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

Für Swift 4.2

Angenommen, Sie haben eine Klasse mit dem Namen NibView und die zugehörige Nib-Datei ist 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
    }

}

erstellen Sie eine Instanz der Klasse und fügen Sie in Ihrer Ansicht das gewünschte Layout hinzu

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
1
Noshaid Ali