Подтвердить что ты не робот

Создайте автономный вид в раскадровке для использования программно

Я пытаюсь создать и создать UIView с помощью раскадровки, но включив его в UIActionSheet программно. Это в основном, чтобы избежать использования функций позиционирования CoreGraphics с пикселями

В старом xcode я помню, что можно было перетащить UIView на nib без каких-либо контроллеров.

Очевидно, что представление должно быть связано с классом, поэтому он будет иметь IBOutlet, но не будет добавлен в self.view

Одна вещь, которая заставляет меня чувствовать, что это должно быть возможно, заключается в том, что если вы перетащите UIView в черный бар контроллера в раскадровке, он появится на месте так:

Snapped in UIView

Но его не показано на экране. Для чего эта функция? Могу ли я каким-то образом открыть это представление и немного его сконструировать?

4b9b3361

Ответ 1

Просто создайте новый .xib файл.

  • Щелкните правой кнопкой мыши в области навигатора и выберите "Новый файл...".
  • Выберите "Пользовательский интерфейс" в списке справа и выберите "Вид".
  • Нажмите "Далее", "Далее", дайте вашему новому виду имя и "Создать".
  • В ваш проект добавится новая заливка .xib.
  • Двойной щелчок на новом .xib файле, и он открывается в Interface Builder (не в раскадровке).
  • Редактируйте/создайте свое представление по своему усмотрению.

Затем после того, как у вас появилось новое представление (.xib) в Interface Builder, просто создать новый подкласс UIView (например MyView), переключив класс вашего нового представления (.xib) на MyView, создав экземпляр MyView в вашем контроллере и добавление его в качестве подсмотра в другое представление.


* И чтобы ответить на ваш вопрос об этом маленьком черном столбце внизу, он называется "Dock", и это просто мини-представление документов верхнего уровня вашей сцены. Док-станция удобна для быстрого перетаскивания значков и создания соединений. См. Описание раскадровки Apple здесь. Рэй Вендерлих легко читает учебник по раскадровки здесь.

Ответ 2

У вас не может быть UIView вне UIViewController на раскадровке. Я предполагаю, потому что раскадровка не имела понятия, как идентифицировать или создавать экземпляр с помощью текущего API. Это то, что я использовал для себя. Решение просто использует XIB для одного UIView и загружает его программно (как и раньше). Я нашел использование раскадровки для большинства элементов и пару XIB для повторного использования просмотров на нескольких контроллерах представления, которые хорошо работают вместе.

Вот некоторый код, который я использую для загрузки XIB как части пользовательского объекта с инициализацией объекта.

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [[[NSBundle mainBundle] loadNibNamed:@"BannerView" owner:self options:nil] objectAtIndex:0];
        [self addSubview:self.view];
        self.frame = self.view.frame;
    }
    return self;
}

Что касается перетаскивания представлений в черную полосу на раскадровки. Эти представления по-прежнему являются частью UIViewController, но они не являются подзонами верхнего уровня. Я думаю, что схема документа хорошо иллюстрирует иерархию.

Следующий вид имеет 2.1.1 View, 2.1.2 View и т.д. вне моей основной иерархии представлений, потому что они не являются элементами моего основного вида. В результате они не будут отображаться по умолчанию. У меня есть настройка IBOutlets, и я условно добавляю/удаляю их из своей основной иерархии представлений, используя стандартные addSubview: и removeFromSuperview.

IB Document Outline example