113 votes

Comment charger un fichier xib dans une UIView ?

J'ai cherché partout et rien n'a fonctionné pour moi jusqu'à présent.

En gros, je veux avoir un fichier .xib appelé rootView.xib et à l'intérieur de celui-ci je veux avoir une UIView (appelons-la containerView) qui ne prend que la moitié de l'écran (il y aurait donc la vue normale et une nouvelle vue). Ensuite, je veux un fichier .xib différent appelé firstView.xib et le charger à l'intérieur de containerView. Ainsi, je peux avoir un tas de choses sur firstView.xib et un tas de choses différentes dans rootView.xib et charger mon firstView.xib à l'intérieur de containerView dans rootView.xib, mais comme il ne prend que la moitié de l'écran, vous verrez toujours les choses sur rootView.xib.

184voto

chown Points 25161

Pour obtenir un objet d'un fichier xib par programme, vous pouvez utiliser : [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil] qui renvoie un tableau des objets de premier niveau du xib.

Ainsi, vous c faire quelque chose comme ça :

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

23voto

Paul Solt Points 2641

J'ai créé un exemple de projet sur github pour charger une UIView à partir d'un fichier .xib dans un autre fichier .xib. Vous pouvez également le faire par programme.

C'est une bonne chose pour les petits widgets que vous souhaitez réutiliser sur différents objets UIViewController.

  1. Nouvelle approche : https://github.com/PaulSolt/CustomUIView
  2. Approche originale : https://github.com/PaulSolt/CompositeXib

Load a Custom UIView from .xib file

21voto

NJones Points 20265

Vous pouvez essayer :

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

21voto

[Mise en œuvre de Swift]

Méthode universelle de chargement d'une vue à partir d'un fichier xib :

Ejemplo:

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

Mise en œuvre :

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

6voto

Nazmul Hasan Points 4930

Créer un fichier XIB :

Fichier -> nouveau Fichier ->ios->cocoa touch class -> next

enter image description here

Veillez à cocher la case "créer également un fichier XIB".

J'aimerais me produire avec tableview J'ai donc choisi la sous-classe UITableViewCell

vous pouvez choisir selon vos besoins

enter image description here

Fichier XIB à votre convenance (RestaurantTableViewCell.xib)

enter image description here

Nous devons saisir la hauteur de la ligne pour définir la hauteur de chaque ligne du tableau.

enter image description here

Maintenant, il faut les mettre dans un fichier rapide. Je suis dans un fichier rapide. restaurantPhoto y restaurantName vous pouvez tous vous faire jeter.

enter image description here

Ajout d'un UITableView

enter image description here

nom
Le nom du fichier nib, qui ne doit pas inclure l'extension .nib.

propriétaire
L'objet à affecter à l'objet Propriétaire du fichier de la plume.

options
Un dictionnaire contenant les options à utiliser lors de l'ouverture du fichier nib.

premier Si vous ne définissez pas d'abord, vous récupérez toutes les vues vous devez donc récupérer une vue à l'intérieur de cet ensemble. frist .

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

Voici le code complet du contrôleur de vue de la table

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
    }

}

vous l'avez fait :)

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X