Cómo cargar un archivo xib en una UIView

111

He estado buscando por todas partes y hasta ahora nada me ha funcionado.

Básicamente, quiero tener un archivo .xib llamado rootView.xib y dentro de él quiero tener un UIView (llamémoslo containerView) que ocupa solo la mitad de la pantalla (por lo que habría la vista normal y una nueva vista). Entonces quiero un archivo .xib diferente llamado firstView.xib y cargarlo dentro de containerView. Entonces puedo tener un montón de cosas en firstView.xib y un montón de cosas diferentes en rootView.xib y cargar mi firstView.xib dentro de containerView en rootView.xib, pero como solo ocupa la mitad de la pantalla, todavía vería el cosas en rootView.xib

Mate
fuente
2
Tenga en cuenta que esta misión es arcaica. Desde hace muchos años, simplemente use el tutorial de
Fattie

Respuestas:

181

Para obtener un objeto de un archivo xib mediante programación, 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];
chown
fuente
@PaulSolt señor, tengo una consulta relacionada con esta pregunta. Quiero abrir la subvista de xib como menú de diapositivas. Cuando hago clic en el botón de menú desde el controlador de vista, solo se debe deslizar la subvista (que es la mitad de la pantalla de xib). por favor ayude si es posible.
sandeep tomar
No funciona con thisView.alpha = 0, thisView.superview(muestra cero)
Jack
24

Creé un proyecto de muestra en github para cargar un UIView desde un archivo .xib dentro de otro archivo .xib. O puede hacerlo mediante programación.

Esto es bueno para los pequeños widgets que desea reutilizar en diferentes objetos UIViewController.

  1. Nuevo enfoque: https://github.com/PaulSolt/CustomUIView
  2. Enfoque original: https://github.com/PaulSolt/CompositeXib

Cargue una UIView personalizada desde un archivo .xib

Paul Solt
fuente
¡Gran lib, funciona muy bien! ¿Lo sigues usando tú mismo? :)
AnthoPak
Utilizo esta técnica de carga con un Storyboard y un archivo XIB para una vista personalizada en mi BrewCoffeeApp.com cuando la receta de café ha comenzado.
Paul Solt
21

Tu podrías intentar:

UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];
NJones
fuente
No es precisamente lo que sugieres. Dijo que su "rootView.xib" tendría un subView de la mitad del tamaño de la pantalla llamado "containerView". Y en containerView quería cargar el contenido de su plumilla "firstView.xib".
NJones
19

[Implementación rápida]

Manera universal de cargar la vista desde xib:

Ejemplo:

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

Implementación:

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))
    }
}
Максим Мартынов
fuente
1
Según el último Swift:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen
6

Cree un archivo XIB:

Archivo -> nuevo Archivo -> ios-> clase cocoa touch -> siguiente

ingrese la descripción de la imagen aquí

asegúrese de marcar "también crear archivo XIB"

Me gustaría actuar con, tableviewasí que elegí la subclaseUITableViewCell

puede elegir como su requerimiento

ingrese la descripción de la imagen aquí

Diseño de archivo XIB como desee (RestaurantTableViewCell.xib)

ingrese la descripción de la imagen aquí

Necesitamos tomar la altura de la fila para establecer la altura de cada fila.

ingrese la descripción de la imagen aquí

¡Ahora! Necesito engañarlos rápidamente. Estoy engañado restaurantPhotoy restaurantNameustedes pueden follar a todos ustedes.

ingrese la descripción de la imagen aquí

Ahora agregando un UITableView

ingrese la descripción de la imagen aquí

name
El nombre del archivo nib, que no necesita incluir la extensión .nib.

propietario
El objeto que se asignará como el objeto Propietario del archivo de la plumilla.

opciones
Un diccionario que contiene las opciones que se utilizarán al abrir el archivo nib.

primero, si no define primero, luego tomando todas las vistas ... así que necesita tomar una vista dentro de ese conjunto frist.

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

aquí está el código completo del controlador de vista de tabla

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

ingrese la descripción de la imagen aquí

Nazmul Hasan
fuente
1
podrías decir por favor. ¿por abajo votaron entonces estaré contenta
Nazmul Hasan
6
Su ejemplo está bien para verlo desde la carga de xib. Pero para tableView está mal - las celdas reutilizables son la forma correcta
Viktor
4

Para swift 3 y 4

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

Para Swift 4.2

Supongamos que tiene una clase llamada NibView y el archivo nib asociado es 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
    }

}

cree una instancia de la clase y agregue en su vista con su diseño específico lo que desee

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