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


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

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

6 101

6 ответов:

для получения объекта из 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];

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

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

  1. новый подход:https://github.com/PaulSolt/CustomUIView
  2. оригинальный подход:https://github.com/PaulSolt/CompositeXib

Load a Custom UIView from .xib file

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

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

[Быстрое Исполнение]

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

пример:

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

реализация:

extension NSBundle {

    static func loadView<T>(fromNib name: String, withType type: T.Type) -> T {
        if let view = NSBundle.mainBundle().loadNibNamed(name, owner: nil, options: nil)?.first as? T {
            return view
        }

        fatalError("Could not load view with type " + String(type))
    }
}

создать XIB файл:

-7-->новый файл ->прошивкой->сенсорная класс -> какао следующей

enter image description here

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

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

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

теперь добавление UITableView

enter image description here

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

владелец
Объект для назначения в качестве объекта владельца файла наконечника.

опции
Словарь, содержащий параметры при открытии файла 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

для swift 3 & 4

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