Декомпозиция пользовательского интерфейса iPhone — несколько представлений в одном xib?

StackOverflow https://stackoverflow.com/questions/1909805

Вопрос

У меня есть одно основное представление со связанным контроллером.У меня есть довольно сложные панели инструментов, которые мне нужно включать и выключать в зависимости от взаимодействия с пользователем.

Для простоты я управляю панелями инструментов с помощью моего основного контроллера представления, вместо того, чтобы использовать всевозможные переплетающиеся зависимости или очень глубокие цепочки делегатов.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top