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

Mat
la source
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];
chown
la source
@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

Paul Solt
la source
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];
NJones
la source
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))
    }
}
Максим Мартынов
la source
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

Nazmul Hasan
la source
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
raed
la source
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)
Noshaid Ali
la source