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
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];
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.
Tu pourrais essayer:
UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];
[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
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
Un fichier XIB à votre guise (RestaurantTableViewCell.xib)
nous avons besoin de saisir la hauteur de la ligne pour mettre en table chaque ligne hegiht
Maintenant! besoin de huck leur fichier Swift. Je suis caché le restaurantPhoto
et restaurantName
vous pouvez vous tous.
Ajoutant maintenant une UITableView
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 :)
Pour Swift 3 & 4
let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as? CustomView
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)