So laden Sie eine xib-Datei in eine UIView

111

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

Grundsätzlich möchte ich eine .xib-Datei namens rootView.xib und darin eine UIView (nennen wir sie 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 eine Menge Sachen auf firstView.xib und eine Menge verschiedener Sachen in rootView.xib haben und meine firstView.xib in containerView in rootView.xib laden, aber da es nur die Hälfte des Bildschirms einnimmt, würde man das immer noch sehen Sachen auf rootView.xib

Matt
quelle
2
Beachten Sie, dass diese Quest archaisch ist. Verwenden Sie seit vielen Jahren einfach das Tutorial für
Fattie

Antworten:

181

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

Sie könnten also so etwas tun:

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];
chown
quelle
@ PaulSolt Sir, ich habe eine Frage zu dieser Quest. Ich möchte die Unteransicht von xib als Folienmenü öffnen. Wenn ich im View Controller auf die Menüschaltfläche klicke, sollte nur die Unteransicht (die den halben Bildschirm von xib darstellt) verschoben werden. Bitte helfen Sie, wenn es möglich ist.
Sandeep Tomar
Es funktioniert nicht mit thisView.alpha = 0, thisView.superview(zeigt nil)
Jack
24

Ich habe ein Beispielprojekt auf github erstellt, um eine 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 für verschiedene UIViewController-Objekte wiederverwenden möchten.

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

Laden Sie eine benutzerdefinierte UIView aus der .xib-Datei

Paul Solt
quelle
Tolle Bibliothek, funktioniert super! Benutzt du es immer noch selbst? :)
AnthoPak
Ich verwende diese Ladetechnik mit einem Storyboard und einer XIB-Datei für eine benutzerdefinierte Ansicht in meiner BrewCoffeeApp.com, wenn das Kaffeerezept gestartet wurde.
Paul Solt
21

Du könntest es versuchen:

UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];
NJones
quelle
Es ist nicht genau das, was Sie vorgeschlagen haben. Er sagte, seine "rootView.xib" hätte eine Unteransicht, die halb so groß wie der Bildschirm mit dem Namen "containerView" sei. Und in containerView wollte er den Inhalt seiner Feder "firstView.xib" laden.
NJones
19

[Schnelle Implementierung]

Universelle Methode zum Laden der Ansicht 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))
    }
}
Максим Мартынов
quelle
1
Wie spätestens Swift:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen
6

Erstellen Sie eine XIB-Datei:

Datei -> neue Datei -> ios-> Kakao-Touch-Klasse -> weiter

Geben Sie hier die Bildbeschreibung ein

Stellen Sie sicher, dass das Kontrollkästchen "Auch XIB-Datei erstellen" aktiviert ist.

Ich würde gerne mit auftreten, tableviewalso habe ich die Unterklasse gewähltUITableViewCell

Sie können als Ihre Anforderung wählen

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

Wir müssen die Zeilenhöhe erfassen, um die Tabelle für jede Zeilenhöhe festzulegen

Geben Sie hier die Bildbeschreibung ein

Jetzt! müssen sie schnell Datei huck. Ich habe mich versteckt restaurantPhotound restaurantNamedu kannst dich alle verstecken.

Geben Sie hier die Bildbeschreibung ein

Fügen Sie nun eine UITableView hinzu

Geben Sie hier die Bildbeschreibung ein

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

Eigentümer
Das Objekt, das als Eigentümerobjekt der NIB-Datei zugewiesen werden soll.

options
Ein Wörterbuch mit den Optionen, die beim Öffnen der NIB-Datei verwendet werden sollen.

zuerst, wenn Sie nicht zuerst definieren, dann alle Ansichten erfassen. Sie müssen also eine Ansicht innerhalb dieses Satzes erfassen frist.

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

Hier ist Table View Controller Vollständiger Code

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

Geben Sie hier die Bildbeschreibung ein

Nazmul Hasan
quelle
1
Könntest du es bitte sagen? Warum runter gewählt, dann werde ich froh sein
Nazmul Hasan
6
Ihr Beispiel ist für die Ansicht beim Laden von xib in Ordnung. Aber für tableView ist es falsch - wiederverwendbare Zellen sind richtig
Viktor
4

Für schnelle 3 & 4

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

Für Swift 4.2

Angenommen , Sie haben eine Klasse mit dem Namen NibView und die zugehörige NIB- Datei lautet 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 Ihrer Ansicht mit Ihrem spezifischen Layout das hinzu, was Sie möchten

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