Come caricare un file xib in un UIView


111

Ho cercato ovunque e niente finora ha funzionato per me.

Fondamentalmente voglio avere un file .xib chiamato rootView.xib e al suo interno voglio avere un UIView (chiamiamolo containerView) che occupa solo metà dello schermo (quindi ci sarebbe la visualizzazione normale e una nuova visualizzazione). Quindi voglio un file .xib diverso chiamato firstView.xib e caricarlo all'interno di containerView. Quindi posso avere un sacco di cose su firstView.xib e un sacco di cose diverse in rootView.xib e caricare il mio firstView.xib all'interno di containerView in rootView.xib ma poiché occupa solo metà dello schermo, vedresti comunque il cose su rootView.xib


2
Nota, questa ricerca è arcaica. Ormai da molti anni, utilizza semplicemente il tutorial
Fattie

Risposte:


181

Per ottenere un oggetto da un file xib in modo programmatico è possibile utilizzare: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil]che restituisce un array degli oggetti di primo livello in xib.

Quindi, si potrebbe fare qualcosa di simile:

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 signore ho una domanda relativa a questa ricerca. voglio aprire la sottoview di xib come menu diapositiva. Quando faccio clic sul pulsante del menu dal controller della vista, solo la vista secondaria (che è metà schermo di xib) dovrebbe essere scorrevole. per favore aiutatemi se possibile.
sandeep tomar

Non funziona con thisView.alpha = 0, thisView.superview(mostra zero)
Jack

24

Ho creato un progetto di esempio su GitHub per caricare una UIView da un file .xib all'interno di un altro file .xib. Oppure puoi farlo in modo programmatico.

Questo è utile per piccoli widget che desideri riutilizzare su diversi oggetti UIViewController.

  1. Nuovo approccio: https://github.com/PaulSolt/CustomUIView
  2. Approccio originale: https://github.com/PaulSolt/CompositeXib

Carica una UIView personalizzata dal file .xib


Grande libreria, funziona alla grande! Lo stai ancora usando da solo? :)
AnthoPak

Uso questa tecnica di caricamento con uno Storyboard e un file XIB per una visualizzazione personalizzata nel mio BrewCoffeeApp.com quando la ricetta del caffè è iniziata.
Paul Solt

21

Potresti provare:

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

Non è esattamente quello che hai suggerito. Ha detto che il suo "rootView.xib" avrebbe una subView la metà delle dimensioni dello schermo denominata "containerView". E in containerView voleva caricare il contenuto del suo pennino "firstView.xib".
NJones

19

[Rapida implementazione]

Modo universale per caricare la vista da xib:

Esempio:

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

Implementazione:

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
Come da ultimo Swift:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen

6

Crea un file XIB:

File -> nuovo File -> ios-> cocoa touch class -> successivo

inserisci qui la descrizione dell'immagine

assicurati che il segno di spunta "crea anche file XIB"

Mi piacerebbe esibirmi con tableview così ho scelto una sottoclasseUITableViewCell

puoi scegliere come richiesta

inserisci qui la descrizione dell'immagine

File XIB progettato come desideri (RestaurantTableViewCell.xib)

inserisci qui la descrizione dell'immagine

dobbiamo prendere l'altezza della riga per impostare l'altezza di ogni riga della tabella

inserisci qui la descrizione dell'immagine

Adesso! bisogno di huck loro file rapidi. sono fottuto restaurantPhotoe restaurantNametu puoi fottere tutti voi.

inserisci qui la descrizione dell'immagine

Ora aggiungendo un UITableView

inserisci qui la descrizione dell'immagine

nome
Il nome del file pennino, che non deve includere l'estensione .nib.

proprietario
L'oggetto da assegnare come oggetto Proprietario del file del pennino.

opzioni
Un dizionario contenente le opzioni da utilizzare quando si apre il file pennino.

prima se non si definisce prima, quindi catturare tutta la vista .. quindi è necessario prendere una vista all'interno di quel set frist.

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

ecco il codice completo del controller di visualizzazione della tabella

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
    }

}

ce l'hai fatta :)

inserisci qui la descrizione dell'immagine


1
potresti dirlo per favore. perché ho votato verso il basso quindi sarò felice
Nazmul Hasan

6
Il tuo esempio va bene per la visualizzazione dal caricamento xib. Ma per tableView è sbagliato - le celle riutilizzabili sono il modo corretto
Viktor

4

Per swift 3 e 4

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

2

Per Swift 4.2

Supponiamo di avere una classe denominata NibView e il file pennino associato sia 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
    }

}

crea un'istanza della classe e aggiungi nella tua vista con il tuo layout specifico quello che vuoi

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.