web-dev-qa-db-fra.com

Comment charger un fichier xib dans un UIView

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

En gros, je veux avoir un fichier .xib appelé rootView.xib et à l'intérieur, je veux un UIView (appelons-le containerView) qui occupe seulement la moitié de l'écran (donc il y aurait une vue normale et une nouvelle vue). Ensuite, je veux un autre fichier .xib appelé firstView.xib et le charge à l'intérieur de containerView. Je peux donc 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 cela ne prend que la moitié de l'écran, trucs sur rootView.xib

106
Matt

Pour obtenir un objet à partir d'un fichier xib par programme, vous pouvez utiliser: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil] qui retourne un tableau des objets de niveau supérieur dans xib.

Donc, vous pourriez faire quelque chose comme ceci:

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

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

Cela convient aux 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

24
Paul Solt

Tu pourrais essayer:

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

[Mise en œuvre rapide]

Mode de chargement universel vue depuis xib:

Exemple:

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

La mise en oeuvre:

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

Créez un fichier XIB:

Fichier -> nouveau Fichier -> ios-> classe tactile cacao -> suivant

enter image description here

assurez-vous que la case "créer également un fichier XIB" est cochée

Je voudrais jouer avec tableview alors j'ai choisi la sous-classe UITableViewCell

vous pouvez choisir comme votre requerment

enter image description here

Un fichier XIB à votre guise (RestaurantTableViewCell.xib)

enter image description here

nous avons besoin de saisir la hauteur de la ligne pour mettre en table chaque ligne hegiht

enter image description here

Maintenant! besoin de huck leur fichier Swift. Je suis caché le restaurantPhoto et restaurantName vous pouvez vous tous.

enter image description here

Ajoutant maintenant une UITableView

enter image description here

name
Nom du fichier nib, qui n'a pas besoin d'inclure l'extension .nib.

propriétaire
Objet à affecter en tant qu’objet Propriétaire du fichier nib.

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

en premier si vous ne définissez pas d'abord puis en saisissant toutes les vues .. vous devez donc saisir une vue à l'intérieur de cet ensemble frist.

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

voici le contrôleur de vue de table Code complet

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

enter image description here

5
Nazmul Hasan

Pour Swift 3 & 4

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

Pour Swift 4.2

Supposons que vous avez une classe nommée NibView et que le fichier nib associé est 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
    }

}

créer une instance de la classe et ajouter dans votre vue avec votre mise en page spécifique ce que vous voulez

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