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

111

Я искал везде и пока ничего не помогло.

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

Мэтт
источник
2
Обратите внимание, этот квест архаичен. Уже много лет просто используйте руководство по
Fattie

Ответы:

181

Чтобы программно получить объект из файла 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];
Chown
источник
@PaulSolt, сэр, у меня есть вопрос, связанный с этим квестом. Я хочу открыть подвид xib как слайд-меню. Когда я нажимаю кнопку меню на контроллере представления, должно сдвигаться только подвид (которое является половиной экрана xib). пожалуйста, помогите, если это возможно.
sandeep tomar
Он не работает с thisView.alpha = 0, thisView.superview(показывает ноль)
Jack
24

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

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

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

Загрузите пользовательский UIView из файла .xib

Пол Солт
источник
Отличная библиотека, отлично работает! Вы все еще пользуетесь им? :)
AnthoPak
Я использую эту технику загрузки с раскадровкой и файлом XIB для настраиваемого представления в моем BrewCoffeeApp.com, когда начинается рецепт кофе.
Пол Солт
21

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

UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];
NJones
источник
Это не совсем то, что вы предлагали. Он сказал, что его "rootView.xib" будет иметь вложенный вид в половину размера экрана с именем "containerView". И в containerView он хотел загрузить содержимое своего пера firstView.xib.
NJones
19

[Быстрая реализация]

Универсальный способ загрузки представления из 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))
    }
}
Максим Мартынов
источник
1
Согласно последнему Swift:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen
6

Создайте файл XIB:

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

введите описание изображения здесь

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

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

вы можете выбрать в качестве требования

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

Сейчас! нужно закинуть их быстрым напильником. Я взбунтовался, restaurantPhotoи restaurantNameты можешь всех уложить .

введите описание изображения здесь

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

введите описание изображения здесь

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

owner
Объект, назначаемый как объект-владелец файла пера.

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

сначала, если вы не определите сначала, затем захватите все представления .. поэтому вам нужно захватить одно представление внутри этого набора 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
    }

}

ты сделал :)

введите описание изображения здесь

Назмул Хасан
источник
1
подскажите пожалуйста. почему проголосовали против, тогда я буду рад
Назмул Хасан
6
Ваш пример подходит для просмотра из загрузки xib. Но для tableView это неправильно - многоразовые ячейки - это правильный путь
Виктор
4

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

let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as? CustomView
Raed
источник
2

Для 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)
Ношайд Али
источник