Декомпозиция пользовательского интерфейса iPhone — несколько представлений в одном xib?
-
19-09-2019 - |
Вопрос
У меня есть одно основное представление со связанным контроллером.У меня есть довольно сложные панели инструментов, которые мне нужно включать и выключать в зависимости от взаимодействия с пользователем.
Для простоты я управляю панелями инструментов с помощью моего основного контроллера представления, вместо того, чтобы использовать всевозможные переплетающиеся зависимости или очень глубокие цепочки делегатов.
В любом случае, как я могу иметь несколько представлений в одном xib и правильно их инициализировать?Например, если я хочу отобразить одно из моих пользовательских представлений в центре экрана, как мне это сделать?
В качестве альтернативы, если я разделю представления на несколько xib, как я могу заставить их ссылаться на один и тот же объект контроллера для своих IBOutlets/IBActions?
Решение
В любом случае, как я могу иметь несколько просмотров в одном XIB и правильно их инициализировать?Например, если я хочу отобразить один из моих пользовательских видов в центре экрана, как бы я это сделал?
Вы можете иметь столько UIView
как вы хотите в своем xib.Обычно вы делаете одно из «основных» представлений — то, которое подключено к свойству представления владельца файла (т. е.ваш контроллер представления) - а остальные могут находиться в xib на том же уровне.Вы также можете подключить их к другим свойствам в контроллере представления.
Вы можете сделать эти представления как подпредставления для основного вида.(Мало, это много просмотров).Допустим, у вас есть два мнения, FooView
и BarView
.Вы хотите FooView
присутствовать при запуске.Итак, вы просто установили BarView
быть скрытым в IB.Тогда ваш контроллер представления может выглядеть примерно так:
@interface MyViewController : UIViewController
{
FooView* fooView;
BarView* barView;
...
}
...
@property (nonatomic, retain) IBOutlet FooView* fooView;
@property (nonatomic, retain) IBOutlet BarView* barView;
...
Затем внутри вашего кода, когда вы захотите изменить представление, просто используйте setHidden:
метод, чтобы скрыть одно и показать другое.
В качестве альтернативы, если я разделяю представления на несколько XIBS, как я могу попросить их ссылаться на один и тот же объект контроллера для их iBoutlets/ibactions?
У вас могут быть другие xib, использующие один и тот же контроллер представления.Я сам много раз это делал.Просто установите для владельца файла соответствующий класс.
Другие советы
На самом деле это очень просто.Вы просто создаете новое представление корневого уровня в своем файле XIB и создаете IBOutlet
для этого представления в вашем основном контроллере представления.
Что касается загрузки представлений непосредственно из XIB, использующих один и тот же контроллер представления, это немного более неряшливо.вам, по сути, нужно будет просмотреть элементы в файле XIB и найти элемент, который вы ищете.
В этом подходе следует отметить одну вещь: все представления инициализируются, когда какое-либо из представлений необходимо.
Если ваши представления просты, это может не иметь значения, но если у вас сложные представления, это может замедлить загрузку вашего приложения.
Если представления несколько сложны, вам следует разделить их на разные .xib
файлы.В этом случае родитель UIViewController
бы IBOutlets к другому UIViewController
подклассы, а не IBOutlets для UIViews
.Контроллеры представлений автоматически обрабатывают отложенную загрузку соответствующих представлений.