Создайте автономный вид в раскадровке для использования программно
Я пытаюсь создать и создать UIView
с помощью раскадровки, но включив его в UIActionSheet
программно. Это в основном, чтобы избежать использования функций позиционирования CoreGraphics с пикселями
В старом xcode я помню, что можно было перетащить UIView на nib без каких-либо контроллеров.
Очевидно, что представление должно быть связано с классом, поэтому он будет иметь IBOutlet, но не будет добавлен в self.view
Одна вещь, которая заставляет меня чувствовать, что это должно быть возможно, заключается в том, что если вы перетащите UIView в черный бар контроллера в раскадровке, он появится на месте так:
![Snapped in UIView]()
Но его не показано на экране. Для чего эта функция? Могу ли я каким-то образом открыть это представление и немного его сконструировать?
Ответы
Ответ 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]()