Предотвратить отклонение UIAlertView

Как форма проверки, есть ли способ предотвратить отклонение вида предупреждения при нажатии кнопки "ОК"?

Сценарий: у меня есть 2 текстовых поля в alertview для имени пользователя/пароля. Если оба пустые и пользователь нажимает "ОК", я не хочу, чтобы предупреждение было отклонено.

Ответ 1

iOS 5 вводит новое свойство UIAlertView для обработки именно этой проблемы.

alert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;

Документация Apple по UIAlertView.

Добавьте новый метод UIAlertViewDelegate, чтобы обрабатывать включение/отключение кнопки.

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView

Документация Apple по UIAlertViewDelegate.

Ответ 2

Вы делаете это неправильно, вы должны включить и отключить кнопку отправки в соответствии с вводом. Сначала вы должны получить доступ к кнопке. Это легко, просто создайте оповещение без кнопок, создайте автономную кнопку и добавьте ее в диалог:

[alert addButtonWithTitle:@"OK"];
UIButton *submitButton = [[alert subviews] lastObject];
[submitButton setEnabled:…];

И тогда вы должны установить делегат для этих текстовых полей и включить или отключить кнопку при изменении полей:

- (BOOL) textField: (UITextField*) textField
    shouldChangeCharactersInRange: (NSRange) range
    replacementString: (NSString*) string
{
    int textLength = [textField.text length];
    int replacementLength = [string length];
    BOOL hasCharacters = (replacementLength > 0) || (textLength > 1);
    [self setButtonsAreEnabled:hasCharacters];
}

// Disable the ‘Return’ key on keyboard.
- (BOOL) textFieldShouldReturn: (UITextField*) textField
{
    return NO;
}

Конечно, вы должны обернуть все это в отдельный класс, чтобы не испортить код вызова.

Ответ 3

Я не считаю, что вам действительно нужно передавать имена кнопок. Просто вытащите строку OK и оставьте ее как "ноль".