Як завантажити файл xib в UIView


111

Я шукав всюди, і поки що нічого не працювало на мене.

В основному я хочу мати .xib файл під назвою rootView.xib, а всередині нього я хочу мати UIView (давайте назвати його контейнерView), який займає лише половину екрана (щоб був звичайний і новий перегляд). Тоді я хочу інший .xib-файл під назвою firstView.xib і завантажити його всередину контейнераView. Тож у мене може бути купа речей на firstView.xib та купа різних речей у rootView.xib та завантаження мого firstView.xib всередині контейнераView у 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];

@PaulSolt сер, у мене є запит, пов'язаний з цим квестоном. Я хочу відкрити підвид Xib як слайд-меню. Коли я натискаю кнопку меню з контролера перегляду, повинен бути лише повзунок (це половина екрана xib). будь ласка, допоможіть, якщо можливо.
sandeep tomar

Це не працює thisView.alpha = 0, thisView.superview(показує нуль)
Джек

24

Я створив зразок проекту на github для завантаження UIView з .xib-файлу всередині іншого .xib-файлу. Або ви можете це робити програмно.

Це добре для маленьких віджетів, які ви хочете повторно використовувати для різних об’єктів UIViewController.

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

Завантажте користувальницький UIView з .xib-файлу


Чудова ліб, чудово працює! Ви все ще використовуєте його самостійно? :)
AnthoPak

Я використовую цю техніку завантаження з файлом Storyboard та XIB для користувацького перегляду в моєму BrewCoffeeApp.com, коли рецепт кави почався.
Пол Солт

21

Ви можете спробувати:

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

Це не зовсім те, що ви запропонували. Він сказав, що його "rootView.xib" буде мати підпогляд у половину розміру екрана з назвою "containerView". І в контейнерView він хотів завантажити вміст своєї нитки "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
Відповідно до останнього Свіфта: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, який не повинен містити розширення .nib.

owner
Об'єкт, який потрібно призначити як власнику Файлу власника файлу.

Параметри
Словник, що містить параметри, які слід використовувати під час відкриття файлу 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
    }

}

ти зробив :)

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


1
ви можете сказати, будь ласка. чому вниз проголосували, я буду радий
Назмул Хасан

6
Ваш приклад добре для перегляду з завантаження xib. Але для tableView це неправильно - багаторазові осередки - це вірний спосіб
Віктор

4

Для швидких 3 і 4

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

2

Для Swift 4.2

Припустимо, у вас клас з іменем NibView і пов'язаний з ним файл nib - 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.