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

Matt
fonte
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];
chown
fonte
@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

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

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