Вопрос о контроллере навигации - PullRequest
1 голос
/ 31 мая 2009

Ниже я хочу реализовать:

  1. Основным экраном моего приложения является UITableView. Каждая строка в табличном представлении является категорией, при нажатии на кнопку раскрытия подробностей в строке вы можете увидеть группу элементов в этой категории в подробном представлении категории.

  2. Теперь на главном экране я нажимаю кнопку «+» на панели навигации, чтобы создать новую категорию. (Новая категория станет новой строкой в ​​табличном представлении). Затем приложение приведет меня к представлению «Добавить категорию». (Я использовал presentModalViewController)

  3. В представлении «Добавить категорию» я что-то установил, затем нажмите кнопку «Сохранить», чтобы закрыть представление «Добавить категорию». (Я использовал dismissModalViewControllerAnimated)

  4. Обычно после нажатия кнопки «Сохранить» приложение возвращает меня к основному виду, и я вижу новую строку в таблице.

  5. Но это не то, что я хочу, а то, что я хочу - после нажатия кнопки «Сохранить» представление «Добавить категорию» будет закрыто, но не вернется к основному виду. Вместо этого я увижу детали новой категории, чтобы продолжить добавление элементов в эту категорию. Результат выглядит так же, как «Я возвращаюсь к основному виду и затем нажимаю кнопку раскрытия подробностей вновь созданной строки (категории)».

  6. Кто-нибудь знает, как это реализовать? Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 мая 2009

Вы можете сделать это, немного отсоединив один экран от другого:

- Создайте пользовательский делегат и протокол для модального диалогового окна создания категории. Что-то простое, как:

@protocol CategoryCreationProtocol
- (void) categoryAddDone:(NSString *)category;
- (void) categoryAddCancelled;
@end
...

@interface CategoryCreationDialog : UIViewController {
...
    id<NSObject, CategoryCreationProtocol> categoryDelegate;
}

@property (assign) id< CategoryCreationProtocol, NSObject> categoryDelegate;

- В модальном диалоговом окне, когда пользователь нажимает кнопку «Сохранить», после закрытия контроллера представления вы вызываете метод делегата:

if (categoryDelegate && [categoryDelegate 
        respondsToSelector:@selector(categoryAddDone:)])
            [categoryDelegate categoryAddDone:newCategory];

Также, что-то похожее для кнопки Cancel.

- Ваш главный контроллер реализует метод categoryAddDone и устанавливает себя как categoryDelegate для модального диалога.

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

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

- В общем, использование делегатов / протоколов для push-navcontroller и модальных диалогов является действительно удобным шаблоном для создания развязанных и повторно используемых видов. Таким образом, они могут быть вызваны из разных мест. Чтобы сделать его согласованным, вы также можете захотеть иметь метод show в каждом модальном диалоговом окне и контроллерах push-представления, которые может вызывать вызывающая сторона. Таким образом, есть согласованный способ получить и согласованный способ получить уведомление о том, что с ним покончено.

0 голосов
/ 31 мая 2009

Если вы используете presentModalViewController и соответствующие ему dismissModalViewControllerAnimated, вы вернетесь к контроллеру представления, в котором вы выдавали исходное сообщение presentModalViewController.

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

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...