Это возможно в iOS 6 и более поздних версиях: необходимо реализовать метод
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
На ваш взгляд контроллер. Вы делаете свою проверку там, и если все в порядке, то return YES;
если нет, то return NO;
и метод prepareForSegue не вызывается.
Обратите внимание, что этот метод не вызывается автоматически при программном запуске сегментов. Если вам нужно выполнить проверку, то вы должны вызвать shouldPerformSegueWithIdentifier, чтобы определить, следует ли выполнять переход.
if ([self shouldPerformSegueWithIdentifier:@"segueIdentifier" sender:nil]) { [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]; }
Примечание: принятый ответ является наилучшим подходом, если вы можете настроить таргетинг на iOS 6. Для таргетинга на iOS 5 этот ответ подойдет.
Я не верю, что можно отменить переход
prepareForSegue
. Я бы предложил перенести вашу логику так, чтобыperformSegue
сообщение было отправлено первым.Если вы используете Interface Builder для соединения перехода непосредственно с элементом управления (например, связывание перехода непосредственно с a
UIButton
), то вы можете выполнить это с помощью небольшого рефакторинга. Подключите переход к контроллеру представления вместо определенного элемента управления (удалите старую ссылку перехода, а затем перетащите элемент управления из самого контроллера представления в целевой контроллер представления). Затем создайтеIBAction
в своем контроллере представления и подключите элемент управления к IBAction. Затем вы можете выполнить свою логику (проверить наличие пустого TextField) в IBAction, который вы только что создали, и решить, делать это или нетperformSegueWithIdentifier
программно.источник
Swift 3 : func shouldPerformSegue (withIdentifier identifier: String, sender: Any?) -> Bool
Возвращаемое значение true, если следует выполнить переход, или false, если его следует игнорировать.
Пример :
источник
С другой стороны, предлагать кнопку, которую пользователь не должен нажимать, несколько плохо. Вы можете оставить переход подключенным как стенды, но начать с отключенной кнопки. Затем подключите UITextField «editChanged» к событию на панели управления представлением
источник
Это легко в быстром.
источник
Как сказал Авраам, проверьте действительность или нет в следующей функции.
И
performSegueWithIdentifier:sender:
вызываемое программированием может быть заблокировано перезаписью следующего метода. По умолчанию это не проверка действительным или нет-shouldPerformSegueWithIdentifier:sender:
, мы можем сделать это вручную.источник
[super performSegueWithIdentifier:identifier sender:sender];
действительно правдива?performSegueWithIdentifier:sender:
метод, а не вызываете егоsuper
метод.Должен выполнить Sege для входа в систему Регистрация
источник
Аналогично ответу Каолина - оставить след, привязанный к элементу управления, но проверить элемент управления на основе условий в представлении. Если вы используете взаимодействие с ячейками таблицы, вам также необходимо установить свойство userInteractionEnabled, а также отключить содержимое ячейки.
Например, у меня есть форма в сгруппированном табличном представлении. Одна из ячеек ведет к другому tableView, который действует как сборщик. Всякий раз, когда элемент управления изменяется в главном окне, я вызываю этот метод
источник
Swift 4 Ответ:
Ниже приведена реализация Swift 4 для отмены перехода:
источник
Другой способ - переопределить метод tableView с помощью willSelectRowAt и вернуть nil, если вы не хотите показывать результат.
showDetails()
- это какая-то глупость. В большинстве случаев должна быть реализована модель данных, представленная в ячейке сindexPath
.источник