iPhone: сохранение с проверкой при обратной навигации - PullRequest
3 голосов
/ 15 декабря 2009

В моем приложении для iPhone у меня есть контроллер навигации, главный экран и несколько экранов редактирования. На экране редактирования пользователь вводит некоторые данные, которые должны быть проверены, прежде чем я смогу их сохранить. В идеале я хотел бы обновить данные автоматически при обратной навигации без дополнительной кнопки «Готово». Могу ли я выполнить некоторую проверку и сохранить при переходе назад (т. Е. Когда пользователь нажимает на стандартную кнопку возврата) таким образом, чтобы я мог остановить навигацию и показать какое-либо сообщение об ошибке, если что-то не так? *

Я вижу несколько других возможностей:

  • Создайте мою собственную левую кнопку и сделайте так, чтобы она выглядела как стандартная задняя часть. (Почему Apple не включила этот стиль кнопок в публичный API?)
  • Добавить кнопку «Готово» и сохранять данные, только если пользователь нажимает на них

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

Ответы [ 6 ]

3 голосов
/ 15 декабря 2009

По сути, вы хотите переопределить действие из backBarButton вашего корневого контроллера представления и выполнить свою проверку там. Если проверка прошла успешно, позвоните по номеру UINavigationController popViewControllerAnimated:, в противном случае отобразите предупреждение об ошибке или что-то еще.

Однако, если вы попытаетесь установить свойства target и action для контроллеров корневого представления navigationItem.backBarButton, это не сработает. По-видимому, это должно быть ноль.

Способ обойти это, возможно, заменить стандартную кнопку задней панели пользовательской кнопкой. Вы можете сделать это со стандартным UIBarButtonItem, но вы потеряете форму «стрелки», так как это не доступно как один из стилей. Обходным путем для этого может быть использование пользовательского представления для кнопки. Посмотрите в этой теме , чтобы узнать, как это сделать.

0 голосов
/ 13 марта 2010

Хотя вы, вероятно, уже давно ушли от этого, я только что столкнулся с этой проблемой сегодня. Я думаю, что Apple не хочет, чтобы вы отменяли действие этих кнопок назад. Мое решение состояло в том, чтобы отобразить и предупредить представление (которое отображается на контроллере представления, который вы только что переместили) и использовать метод делегата AlertViews "clickedButtonAtIndex", чтобы переместить пользователя обратно на экран с ошибками. В целом, я думаю, что это довольно чисто. Мои 2 цента ...

0 голосов
/ 24 декабря 2009

Альтернативный способ - сделать так, чтобы ваш родительский вид делал всю работу.

Скажем, вы переходите от представления данных (например, Контактная информация) к представлению редактирования поля (например, Редактирование имени). Прежде чем перейти к представлению редактирования, представление данных хранит некоторую информацию об этом факте, например ::

self.navigatingTo = NavigatingToNameEdit;

Затем в вашем представлении данных viewWillAppear проверьте это и извлеките соответствующую информацию из представления редактирования:

if (self.navigatingTo == NavigatingToNameEdit) {
    self.name = self.nameEditView.name;
    // Don't forget to reset navigatingTo:
    self.navigatingTo = NavigatingToNone;
}
0 голосов
/ 24 декабря 2009

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

0 голосов
/ 16 декабря 2009

Лучший способ «обнаружить, когда нажата кнопка« Назад »», состоит в том, чтобы переопределить viewWillDisappear примерно так:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if (!isPushing) {
        // Apply your changes here
    }
}

Булево значение isPushing будет тем, которое вы определяете сами, и вы устанавливаете его в True только в тех местах, где вы нажимаете другой контроллер самостоятельно (если вы делаете ...), что позволяет вам различать viewWillDisappear вызывается потому, что вы сами запускаете новый контроллер, а не потому, что была нажата кнопка «Назад».

Обычно вы сами помещаете другой контроллер в контроллер стола следующим образом:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Example of pushing a new controller onto the navigation stack yourself...
    isPushing = YES;    // You have to set that boolean here...
    [self.navigationController pushViewController:myNewController animated:YES];
}
0 голосов
/ 16 декабря 2009

Просто переопределите [popViewControllerAnimated:] в вашем подклассе UIViewController. Таким образом, вы описываете более общий сценарий, когда контроллер представления покидает экран.

...