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
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];
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.
Du könntest es versuchen:
UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];
[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
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
XIB-Datei nach Ihren Wünschen (RestaurantTableViewCell.xib)
wir müssen die Zeilenhöhe ermitteln, um die Tabellenhöhe für jede Zeile zu bestimmen
Jetzt! müssen sie hucken Swift file. Ich bin hucked die restaurantPhoto
und restaurantName
Sie können Sie alle hucken.
Füge jetzt eine UITableView hinzu
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 :)
Für Swift 3 & 4
let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as? CustomView
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)