Запретить Storyboard Segue от выполнения действия Segue

Вопрос Как я могу отказать в передаче раскадровки?

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

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

В частности, один пункт меню (строка таблицы) не готов, пока не импортированы некоторые данные (я отправляю уведомление, когда все готово).

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

Скорее всего, я разрешу segue на практике и инициализирую ограничение контроллера представления назначения, пока не получит уведомление, которое ожидает.

Но можно ли перехватить сеанс и остановить его программно?

3 ответа

Решение

В iOS 6.0 и более поздних версиях вы можете предотвратить запуск перехода после действия, которое обычно вызывало бы его, путем переопределения метода -[UIViewController shouldPerformSegueWithIdentifier:sender:] и возврата NO.

Вы могли бы выполнить программный переход, где вместо этого использовать переход от самого контроллера, а затем выполнить переход с использованием exe cuteSegueWithIdentifier, а затем вы можете проверить этот конкретный переход и решить, делать это или нет.

Вы можете создать подкласс UIStoryboardSegue, как описано в его ссылке.

Возможная реализация:

.час

@interface MYPushNoAnimationSegue : UIStoryboardSegue
@end

.m

#import "MYPushNoAnimationSegue.h"

@implementation MYPushNoAnimationSegue

- (void)perform {
    if (condition) {
        [[(UIViewController *)self.sourceViewController navigationController] pushViewController:self.destinationViewController animated:NO];
    }
}

@end

После этого вы можете выбрать существующий переход в раскадровке, затем установить его стиль на пользовательский и ввести MYPushNoAnimationSegue в класс Segue в инспекторе атрибутов.

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

Другие вопросы по тегам