Есть ли способ, чтобы остановить извлечение UIViewController из стека UINavigationController, когда backBarButtonItem коснулся? - PullRequest
6 голосов
/ 24 апреля 2010

У меня есть UINavigationController с корневым контроллером представления, а затем я помещаю UIViewController в стек контроллера навигации. Когда пользователь нажимает backBarButtonItem, я хотел бы иметь возможность отображать всплывающее окно с предупреждением, если выполняются определенные условия, и отменять всплывающее окно контроллера представления. Например, пользователь может сделать определенные выборы, но некоторые их комбинации могут быть недействительными, поэтому я хочу уведомить их о внесении изменений.

Я знаю, что могу помешать пользователю сделать недопустимую комбинацию или открыть всплывающее окно с предупреждением, когда выбрана недопустимая комбинация, но я бы не стал этого делать. Пользователь может изменять выбор и может знать, что определенная комбинация недопустима, но я бы предпочел, чтобы он выбрал что-то, что делает комбинацию недействительной, а затем изменил что-то другое (и уведомил их, если они не внесли изменения, прежде чем пытаться перейти на предыдущий экран). Например, если я не позволю им выбрать то, что создает недопустимую комбинацию, им, возможно, придется прокрутить экран вверх, что-то изменить, затем прокрутить вниз, вместо того, чтобы делать выбор, затем прокрутить вверх и изменить что-то.

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

Есть ли способ предотвратить появление поп-музыки? Если нет, то стоит ли сообщать об ошибке или это излишне и / или эзотерично?

Ответы [ 3 ]

7 голосов
/ 02 февраля 2011

Вы можете заменить кнопку возврата на свою собственную, которая вызывает метод, который вы хотите в loadView

cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" 
                                    style:UIBarButtonItemStyleBordered 
                                    target:self
                                    action:@selector(onCancelButtonSelected:)];



self.navigationItem.leftBarButtonItem = cancelButton;

потом позже

-(void)onCancelButtonSelected:(id)sender {

if (!hasSavedProduct) 
{
    cancelAlert = [[UIAlertView alloc] initWithTitle:@"Product not saved" 
                                             message:@"Exit without saving?" 
                                            delegate:self 
                                   cancelButtonTitle:@"Exit" 
                                   otherButtonTitles:@"Save", 
                                                        nil];
    [cancelAlert show];
    [cancelAlert release];
}

тогда отпусти их

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {



if ([cancelAlert isEqual:actionSheet]) 
{
    if (buttonIndex == 0)
    {
        NSLog(@"Fine. Exiting without saving");


        [self.navigationController popViewControllerAnimated:YES];
    }
    else
    {
        NSLog(@"Save here"); 

    }
}
1 голос
/ 05 мая 2010

Отпустите их, только не сохраняйте ничего, пока это не станет полностью действительным. Это типичный подход Apple.

1 голос
/ 24 апреля 2010

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

Если вы женаты, чтобы делать это в стеке, было бы хорошо, если бы вы могли сделать это с UINavigationControllerDelegate , но вы не можете.

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

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

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