Стратегия для двух взаимоисключающих UIViews - PullRequest
2 голосов
/ 03 марта 2010

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

В моем приложении есть два «пути»; либо вы находитесь в части «А», либо вы находитесь в части «Б». Из части «А» вы можете перейти к части «В» и наоборот.

Я разработал его так, чтобы у класса делегата приложения было два метода; switchToAView и switchToBView

Таким образом, находясь в середине BView и вызывая метод switchToAView в делегате приложения, следует полностью освободить все, что связано с BView, и отправить пользователя на AView.

Я обнаружил, что при переключении на AView представление BView все еще сохраняется.

Каждый вид принадлежит собственности.

interface;
@property(nonatomic, retain) UIView *viewA 
@property(nonatomic, retain) UIView *viewB 
implementation;
@synthesize viewA, viewB

в приложении Delegate.

Я поставил точку останова в методе dealloc двух представлений. (viewA и viewB). Теперь это происходит; При загрузке viewA и переключении на viewB ничего не высвобождается (как и ожидалось). Затем, когда я переключаюсь с viewB на viewA, сначала освобождается viewA (сгенерированным установщиком, насколько я понимаю). а затем viewA инициализируется и отображается. Это прекрасно работает, но имеет недостаток в том, что и viewA, и viewB находятся в стеке одновременно: / это нежелательно, поскольку они взаимоисключающие. viewA высвобождается только тогда, когда появляется новый viewA, однако, viewA должен высвобождаться при добавлении viewB в окно

Затем я попытался выпустить viewA в методе switchToBView. Это прекрасно работает при переходе от viewA до viewB. Я проверил с помощью инструментов, и количество сохранений падает до 0 для viewA. Теперь при переключении обратно в viewA приложение вылетает, и я думаю, что это потому, что:

self.viewA = newlyInstantiatedViewA;

setter, сначала отправляет сообщение о выпуске в viewA, но я выпустил viewA ранее, и это вызывает сбой.

Я не могу понять, что использование сеттера таким образом вызовет сбой. («сообщение отправлено на освобожденный экземпляр» и разрыв в методе dealloc последнего подпредставления, добавленного в A при вызове [super dealloc])

Должен ли я выбрать другой подход все вместе? И как мне построить что-нибудь крепкое, обеспечивающее одновременную работу только одного вида?

Извините за длинное письмо, я написал бы меньше, если бы у меня было больше времени: Заранее спасибо за любые решения или предложения по дизайну:)

1 Ответ

4 голосов
/ 03 марта 2010

Должен ли я выбрать другой сблизиться все вместе?

Совершенно определенно, вы смешали логику контроллера представления с вашими представлениями, и у вас есть представления, взаимно сохраняющие друг друга в виде круговой ссылки.

(1) Представления не должны иметь логики для загрузки другого представления. Загрузка и выгрузка представлений является функцией контроллера представлений. Представление должно касаться только логики, непосредственно связанной с дисплеем. Он не должен даже хранить или манипулировать какими-либо пользовательскими данными.

(2) Контроллеры представлений должны редко вызывать другие контроллеры представлений. Контроллер представления должен заботиться об управлении просмотром, чтением и записью данных из представления в модальное состояние данных.

(3) Если вам нужно связать виды, используйте контроллер UINavigation. Это не только для строго визуально иерархических шаблонов представления. Кроме того, вы можете скрыть панель навигации, чтобы пользователь ее никогда не видел. Вы должны иметь контроллер представления, который выдвигает viewA, и когда вам нужно viewB, вызовите навигацию, чтобы вытолкнуть viewA и нажать viewB. Для пользователя это будет выглядеть так, будто наши взгляды просто меняются местами. См. Утилиту в режиме переворота для аналогичного использования.

Ваше приложение работает временно, потому что в языке или API нет ничего, что препятствовало бы превращению почти всей логики приложения в подкласс представления. Однако поддерживать такой дизайн в рабочем состоянии и надежно практически невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...