Как загрузить файл XIB в UIView - PullRequest
       2

Как загрузить файл XIB в UIView

106 голосов
/ 19 октября 2011

Я искал везде, и до сих пор у меня ничего не получалось.

В основном я хочу иметь файл .xib с именем rootView.xib и внутри него я хочу иметь UIView (давайте назовем его containerView), который занимает только половину экрана (поэтому будет обычный вид и новый вид).Затем я хочу другой файл .xib с именем firstView.xib и загружаю его в containerView.Так что я могу иметь кучу вещей в firstView.xib и кучу разных вещей в rootView.xib и загрузить свой firstView.xib внутри containerView в rootView.xib, но, поскольку он занимает только половину экрана, вы все равно увидитематериал на rootView.xib

Ответы [ 7 ]

177 голосов
/ 19 октября 2011

Чтобы получить объект из xib-файла программно, вы можете использовать: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil], который возвращает массив объектов верхнего уровня в xib.

Итак, вы могли бы сделать что-то вроде этого:

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];
24 голосов
/ 23 августа 2013

Я создал пример проекта на github для загрузки UIView из файла .xib внутри другого файла .xib.Или вы можете сделать это программно.

Это хорошо для маленьких виджетов, которые вы хотите использовать в различных объектах UIViewController.

  1. Новый подход: https://github.com/PaulSolt/CustomUIView
  2. Исходный подход: https://github.com/PaulSolt/CompositeXib

Load a Custom UIView from .xib file

19 голосов
/ 19 октября 2011

Вы можете попробовать:

UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];
16 голосов
/ 20 октября 2016

[Быстрое внедрение]

Универсальный способ загрузки представления из xib:

Пример:

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

Реализация:

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))
    }
}
5 голосов
/ 01 ноября 2016

Создание файла XIB:

Файл -> Новый файл -> ios-> класс касания какао -> следующий

enter image description here

убедитесь, что флажок "также создать файл XIB"

Я хотел бы выступить с tableview, поэтому я выбрал подкласс UITableViewCell

вы можете выбрать как ваше требование

enter image description here

Файл XIB по вашему желанию (RestaurantTableViewCell.xib)

enter image description here

нам нужно взять высоту строки, чтобы установить таблицу в каждой строке хегихт

enter image description here

сейчас! нужно взломать их быстрым файлом. меня взбесили restaurantPhoto и restaurantName вы можете взломать всех вас.

enter image description here

Теперь добавляем UITableView

enter image description here

имя
Имя файла пера, который не должен включать расширение .nib.

владелец
Объект, назначаемый в качестве объекта «Владелец файла» пера.

варианты
Словарь, содержащий параметры, используемые при открытии файла пера.

первый если вы не определили сначала, то захватываете все представления .. поэтому вам нужно захватить одно представление внутри этого набора frist.

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

вот контроллер представления таблицы Полный код

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
    }

}

Вы сделали :)

enter image description here

3 голосов
/ 13 марта 2018

Для быстрых 3 и 4

let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as? CustomView
0 голосов
/ 07 марта 2019

Для Swift 4.2

Предположим, у вас есть класс с именем NibView и связанный файл пера 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
    }

}

создайте экземпляр класса и добавьте в ваше представление ваш конкретный макет, что вы хотите

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
...