Запретить 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 в инспекторе атрибутов.
Я знаю, что прошло много времени, может быть, вы уже решили это, но это может помочь другим, кто сталкивается с той же проблемой.