ios - custom - load xib swift 4
Cómo cargar un archivo xib en una UIView (6)
Creé un proyecto de muestra en github para cargar un UIView desde un archivo .xib dentro de otro archivo .xib. O puede hacerlo programáticamente.
Esto es bueno para pequeños widgets que desea reutilizar en diferentes objetos UIViewController.
- Nuevo enfoque: https://github.com/PaulSolt/CustomUIView
- Enfoque original: github.com/PaulSolt/CompositeXib
He estado buscando en todas partes y hasta ahora nada ha funcionado para mí.
Básicamente quiero tener un archivo .xib llamado rootView.xib y dentro de él quiero tener un UIView (vamos a llamarlo containerView) que ocupa solo la mitad de la pantalla (por lo que sería la vista regular y una nueva vista). Luego quiero un archivo .xib diferente llamado firstView.xib y cargarlo dentro de containerView. Así que puedo tener un montón de cosas en FirstView.xib y un montón de cosas diferentes en rootView.xib y cargar mi primerView.xib dentro de containerView en rootView.xib pero dado que solo ocupa la mitad de la pantalla, aún verías el cosas en rootView.xib
Tu podrías intentar:
UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];
[Implementación Swift]
Forma universal de cargar vista desde xib:
Ejemplo:
let myView = NSBundle.loadView(fromNib: "MyView", withType: MyView.self)
Implementación:
extension NSBundle {
static func loadView<T>(fromNib name: String, withType type: T.Type) -> T {
if let view = NSBundle.mainBundle().loadNibNamed(name, owner: nil, options: nil)?.first as? T {
return view
}
fatalError("Could not load view with type " + String(type))
}
}
Crea un archivo XIB:
Archivo -> nuevo archivo -> ios-> clase de toque de cacao -> siguiente
asegúrese de que la marca de verificación "también cree un archivo XIB"
Me gustaría trabajar con tableview
así que UITableViewCell
subclase UITableViewCell
puedes elegir como tu requerimiento
Diseño de archivo XIB como desee (RestaurantTableViewCell.xib)
tenemos que agarrar la altura de la fila para establecer la tabla de cada fila hegiht
¡Ahora! Necesito darles un rápido archivo. Me gustaron el restaurantPhoto
y restaurantName
, puedes colmarte a todos.
Ahora agregando un UITableView
nombre
El nombre del archivo nib, que no necesita incluir la extensión .nib.
propietario
El objeto para asignar como objeto propietario del archivo de punta.
opciones
Un diccionario que contiene las opciones para usar al abrir el archivo de punta.
primero si no defines primero y luego grabas toda la vista ... entonces necesitas tomar una vista dentro de ese conjunto de frist
.
Bundle.main.loadNibNamed("yourUIView", owner: self, options: nil)?.first as! yourUIView
aquí está el controlador de vista de tabla Código completo
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
}
}
lo hiciste :)
Para swift 3 y 4
let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as? CustomView
Para obtener un objeto de un archivo xib programáticamente puede usar: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil]
que devuelve una matriz de los objetos de nivel superior en el xib.
Entonces, podrías hacer algo como esto:
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];