Comment charger un fichier xib dans un UIView


111

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

Fondamentalement, je veux avoir un fichier .xib appelé rootView.xib et à l'intérieur je veux avoir un UIView (appelons-le 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 charge à l'intérieur de containerView. Je peux donc avoir un tas de trucs sur firstView.xib et un tas de trucs différents 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 le trucs sur rootView.xib


2
Notez que ce questin est archaïque. Depuis de nombreuses années maintenant, utilisez simplement le didacticiel
Fattie

Réponses:


181

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 niveau supérieur dans le xib.

Donc, vous pouvez 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];

@PaulSolt monsieur j'ai une question relative à cette question. je veux ouvrir la sous-vue de xib comme menu de diapositives Lorsque je clique sur le bouton de menu à partir du contrôleur de vue, seule la sous-vue (qui est la moitié de l'écran de xib) doit être glissée. s'il vous plaît aider si cela est possible.
sandeep tomar

Cela ne fonctionne pas avec thisView.alpha = 0, thisView.superview(affiche nul)
Jack

24

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

C'est bon 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

Charger un UIView personnalisé à partir d'un fichier .xib


Grande lib, fonctionne très bien! L'utilisez-vous toujours vous-même? :)
AnthoPak

J'utilise cette technique de chargement avec un fichier Storyboard et XIB pour une vue personnalisée dans mon BrewCoffeeApp.com lorsque la recette de café a commencé.
Paul Solt

21

Tu pourrais essayer:

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

Ce n'est pas précisément ce que vous avez suggéré. Il a dit que son "rootView.xib" aurait un subView la moitié de la taille de l'écran nommé "containerView". Et dans containerView, il voulait charger le contenu de sa pointe "firstView.xib".
NJones

19

[Mise en œuvre rapide]

Méthode universelle de chargement de la 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))
    }
}

1
Selon le dernier Swift:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen

6

Créez un fichier XIB:

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

entrez la description de l'image ici

assurez-vous que la coche "crée également un fichier XIB"

Je voudrais jouer avec tableviewdonc j'ai choisi une sous-classeUITableViewCell

vous pouvez choisir comme votre demande

entrez la description de l'image ici

Conception de fichier XIB à votre guise (RestaurantTableViewCell.xib)

entrez la description de l'image ici

nous devons saisir la hauteur de ligne pour définir la hauteur de chaque ligne

entrez la description de l'image ici

Maintenant! besoin de les archiver fichier rapide. Je suis foutu restaurantPhotoet restaurantNamevous pouvez tous vous foutre.

entrez la description de l'image ici

Ajout maintenant d'un UITableView

entrez la description de l'image ici

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

owner
Objet à affecter comme objet File's Owner de la pointe.

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

d'abord 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 code complet du contrôleur de vue de 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 avez fait :)

entrez la description de l'image ici


1
pourriez-vous dire s'il vous plaît. pourquoi voté vers le bas alors je serai heureux
Nazmul Hasan

6
Votre exemple est correct pour une vue depuis le chargement de xib. Mais pour tableView, c'est faux - les cellules réutilisables sont la bonne manière
Viktor

4

Pour Swift 3 & 4

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

2

Pour Swift 4.2

Supposons que vous ayez une classe nommée NibView et 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éez une instance de la classe et ajoutez dans votre vue avec votre mise en page spécifique ce que vous voulez

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.