Jak załadować plik XIB w UIView


111

Szukałem wszędzie i do tej pory nic mi nie wyszło.

Zasadniczo chcę mieć plik .xib o nazwie rootView.xib, a wewnątrz niego chcę mieć UIView (nazwijmy to containerView), który zajmuje tylko połowę ekranu (więc byłby zwykły widok i nowy widok). Następnie chcę inny plik .xib o nazwie firstView.xib i załadować go do kontenera containerView. Mogę więc mieć kilka rzeczy na firstView.xib i kilka różnych rzeczy w rootView.xib i załadować mój firstView.xib w containerView w rootView.xib, ale ponieważ zajmuje tylko połowę ekranu, nadal zobaczysz rzeczy na rootView.xib


2
Uwaga, to zadanie jest archaiczne. Od wielu lat po prostu korzystaj z samouczka dotyczącego
Fattie

Odpowiedzi:


181

Aby programowo pobrać obiekt z pliku xib, możesz użyć: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil]co zwraca tablicę obiektów najwyższego poziomu w xib.

Możesz więc zrobić coś takiego:

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 sir Mam pytanie związane z tym pytaniem. chcę otworzyć widok podrzędny xib jako menu slajdów. Kiedy kliknę przycisk menu w kontrolerze widoku, tylko widok podrzędny (który jest połową ekranu xib) powinien zostać przesunięty. proszę o pomoc, jeśli to możliwe.
sandeep tomar

To nie działa z thisView.alpha = 0, thisView.superview(pokazuje zero)
Jack

24

Utworzyłem przykładowy projekt na github, aby załadować UIView z pliku .xib do innego pliku .xib. Lub możesz to zrobić programowo.

Jest to dobre dla małych widżetów, których chcesz użyć ponownie w różnych obiektach UIViewController.

  1. Nowe podejście: https://github.com/PaulSolt/CustomUIView
  2. Oryginalne podejście: https://github.com/PaulSolt/CompositeXib

Załaduj niestandardowy widok UIView z pliku .xib


Świetna lib, działa świetnie! Czy nadal sam go używasz? :)
AnthoPak

Używam tej techniki ładowania z plikiem Storyboard i XIB, aby uzyskać niestandardowy widok na mojej BrewCoffeeApp.com, gdy rozpoczął się przepis na kawę.
Paul Solt

21

Możesz spróbować:

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

To nie jest dokładnie to, co sugerowałeś. Powiedział, że jego „rootView.xib” będzie miał widok podrzędny o połowę mniejszy niż ekran o nazwie „containerView”. A do containerView chciał załadować zawartość swojej stalówki „firstView.xib”.
NJones

19

[Szybkie wdrożenie]

Uniwersalny sposób ładowania widoku z xib:

Przykład:

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

Realizacja:

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
Jak w najnowszym Swift:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen

6

Utwórz plik XIB:

Plik -> nowy Plik -> ios-> cocoa touch class -> next

wprowadź opis obrazu tutaj

upewnij się, że zaznaczono "także utwórz plik XIB"

Chciałbym z nią występować, tableviewwięc wybrałem podklasęUITableViewCell

możesz wybrać jako swoje wymagania

wprowadź opis obrazu tutaj

Projekt pliku XIB według własnego uznania (RestaurantTableViewCell.xib)

wprowadź opis obrazu tutaj

musimy chwycić wysokość wiersza, aby ustawić wysokość każdego wiersza

wprowadź opis obrazu tutaj

Teraz! trzeba je schować w szybkim pliku. Jestem wkurzony restaurantPhotoi restaurantNamemożecie was wszystkich schwytać .

wprowadź opis obrazu tutaj

Teraz dodajemy UITableView

wprowadź opis obrazu tutaj

nazwa
Nazwa pliku nib, która nie musi zawierać rozszerzenia .nib.

właściciel
Obiekt do przypisania jako obiekt właściciela pliku końcówki.

opcje
Słownik zawierający opcje używane podczas otwierania pliku nib.

najpierw, jeśli nie zdefiniujesz najpierw, a następnie przechwytujesz cały widok ... więc musisz pobrać jeden widok z tego zestawu frist.

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

tutaj jest kontroler widoku tabeli Pełny kod

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
    }

}

Skończyłeś :)

wprowadź opis obrazu tutaj


1
czy możesz powiedzieć, proszę. dlaczego głosowano w dół to będę zadowolony
Nazmul Hasan

6
Twój przykład jest odpowiedni do oglądania z ładowania xib. Ale dla tableView jest źle - komórki wielokrotnego użytku są poprawne
Viktor

4

Do szybkiego 3 i 4

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

2

Dla Swift 4.2

Załóżmy, że masz klasę o nazwie NibView, a powiązany plik nib to 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
    }

}

utwórz instancję klasy i dodaj w widoku z określonym układem, co chcesz

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.