Como carregar um arquivo xib em um UIView


111

Estive procurando em todos os lugares e nada até agora funcionou para mim.

Basicamente, eu quero ter um arquivo .xib chamado rootView.xib e dentro dele eu quero ter um UIView (vamos chamá-lo de containerView) que ocupa apenas metade da tela (então haveria a visualização normal e uma nova visualização). Então eu quero um arquivo .xib diferente chamado firstView.xib e carregá-lo dentro de containerView. Portanto, posso ter um monte de coisas em firstView.xib e um monte de coisas diferentes em rootView.xib e carregar meu firstView.xib dentro de containerView em rootView.xib, mas como ele ocupa apenas metade da tela, você ainda veria o coisas em rootView.xib


2
Observe, esta questin é arcaica. Por muitos anos, basta usar o tutorial de
— Fattie

Respostas:


181

Para obter um objeto de um arquivo xib programaticamente, você pode usar: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil]que retorna uma matriz dos objetos de nível superior no xib.

Então, você poderia fazer algo assim:

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 senhor, tenho uma dúvida relacionada a esta questão. Eu quero abrir a subvisualização do xib como menu de slides. Quando eu clico no botão de menu do controlador de visualização, apenas a subvisualização (que é a metade da tela do xib) deve ser slide. por favor ajude se possível.
— Sandeep Tomar

Não funciona com thisView.alpha = 0, thisView.superview(mostra nulo)
— Jack

24

Eu criei um projeto de amostra no github para carregar um UIView de um arquivo .xib dentro de outro arquivo .xib. Ou você pode fazer isso programaticamente.

Isso é bom para pequenos widgets que você deseja reutilizar em diferentes objetos UIViewController.

  1. Nova abordagem: https://github.com/PaulSolt/CustomUIView
  2. Abordagem original: https://github.com/PaulSolt/CompositeXib

Carregar um UIView personalizado de um arquivo .xib


Grande lib, funciona muito bem! Você ainda está usando? :)
— AnthoPak

Eu uso esta técnica de carregamento com um Storyboard e arquivo XIB para uma visualização personalizada em meu BrewCoffeeApp.com quando a receita de café é iniciada.
— Paul Solt

21

Você poderia tentar:

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

Não é exatamente o que você sugeriu. Ele disse que seu "rootView.xib" teria uma subView com metade do tamanho da tela chamada "containerView". E em containerView ele queria carregar o conteúdo de sua ponta "firstView.xib".
— NJones,

19

[Implementação Swift]

Modo universal de carregar a visualização do xib:

Exemplo:

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

Implementação:

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
De acordo com o Swift mais recente:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
— s.zainulabideen de

6

Crie um arquivo XIB:

Arquivo -> novo arquivo -> ios-> classe de toque cacau -> próximo

insira a descrição da imagem aqui

certifique-se de marcar "também criar arquivo XIB"

Eu gostaria de atuar com, tableviewentão escolhi a subclasseUITableViewCell

você pode escolher como sua consulta

insira a descrição da imagem aqui

Arquivo XIB desenhado como você deseja (RestaurantTableViewCell.xib)

insira a descrição da imagem aqui

precisamos pegar a altura da linha para definir a tabela de cada linha hegiht

insira a descrição da imagem aqui

Agora! precisa carregá-los arquivo rápido. eu sou hucked restaurantPhotoe restaurantNamevocê pode huck todos vocês.

insira a descrição da imagem aqui

Agora adicionando um UITableView

insira a descrição da imagem aqui

nome
O nome do arquivo nib, que não precisa incluir a extensão .nib.

owner
O objeto a ser atribuído como o objeto File's Owner do bico.

opções
Um dicionário contendo as opções a serem usadas ao abrir o arquivo nib.

primeiro, se você não definir primeiro, em seguida, agarrar todas as visualizações ... então, você precisa pegar uma visualização dentro desse conjunto frist.

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

aqui está o código completo do controlador de visualização de tabela

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
    }

}

você fez :)

insira a descrição da imagem aqui


1
você poderia dizer por favor. por que votou contra eu ficarei feliz
— Nazmul Hasan

6
Seu exemplo está ok para visualização do carregamento do xib. Mas para tableView está errado - células reutilizáveis ​​são a maneira correta
— Viktor

4

Para swift 3 e 4

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

2

Para Swift 4.2

Vamos supor que você tenha uma classe chamada NibView e o arquivo nib associado seja 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
    }

}

crie uma instância da classe e adicione em sua visualização com seu layout específico o que você quiser

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.