TextField на AlertView не отображается на iOS 7

До iOS7 я мог добавить UITextField (поле ввода текста) на мой UIAlertView используя этот код.

UITextField *txtNewPassword = [[UITextField alloc] initWithFrame:secondTextFldRect];

        txtNewPassword.delegate     = self;
        txtNewPassword.text         = @"";
        txtNewPassword.clearButtonMode = UITextFieldViewModeWhileEditing;
        txtNewPassword.borderStyle      = UITextBorderStyleRoundedRect;
        txtNewPassword.autocapitalizationType = UITextAutocapitalizationTypeNone;
        txtNewPassword.tag              = kNewPasswordTxtFldTag;
        [txtNewPassword setBackgroundColor:[UIColor whiteColor]];
        [txtNewPassword setKeyboardAppearance:UIKeyboardAppearanceAlert];
        [txtNewPassword setAutocorrectionType:UITextAutocorrectionTypeNo];
        [txtNewPassword setPlaceholder:@"New password"];
        [txtNewPassword setTextAlignment:UITextAlignmentLeft];
        [txtNewPassword setSecureTextEntry:YES];
        [alert addSubview:txtNewPassword];
        [txtNewPassword release];

После обновления до iOS7 перестало работать - мои текстовые поля больше не отображаются. Каков рекомендуемый способ обновления моего кода?

4 ответа

UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:self];
dialog.alertViewStyle=UIAlertViewStylePlainTextInput;
[dialog setTitle:@"Your Title"];
[dialog setMessage:@"your message"];

[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"Ok"];


UITextField *_UITextField  = [dialog textFieldAtIndex:0];
_UITextField.placeholder = @"Placeholder";
_UITextField.keyboardType = UIKeyboardTypeEmailAddress;
[dialog show];

//uialertview delegate method
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(buttonIndex==1)//OK button 
    {
        //do ur stuff
    }
}

Вы хотите использовать "новые" (iOS 5) методы UIAlertView, которые предоставляют вам UITextField. alertViewStyle а также textFieldAtIndex:

Что сводит ваш код к этому:

UIAlertView *alert = [[UIAlertView alloc] ...];
alert.alertViewStyle = UIAlertViewStyleSecureTextInput;

UITextField *txtNewPassword = [alert textFieldAtIndex:0];

txtNewPassword.delegate     = self;
txtNewPassword.text         = @"";
txtNewPassword.clearButtonMode = UITextFieldViewModeWhileEditing;
txtNewPassword.tag              = kNewPasswordTxtFldTag;
[txtNewPassword setPlaceholder:@"New password"];

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

Если вы хотите настроить UIAlertView, вы должны написать свой собственный. Подкласс UIView и сделать его похожим на UIAlertView.

Как предложил Matthias Bauch, вам не нужно добавлять текстовое поле в представление предупреждений, вместо этого используйте UIAlertView имущество alertViewStyle, Он принимает значения, определенные в перечислении UIAlertViewStyle

typedef NS_ENUM(NSInteger, UIAlertViewStyle) {
    UIAlertViewStyleDefault = 0,
    UIAlertViewStyleSecureTextInput, // Secure text input
    UIAlertViewStylePlainTextInput,  // Plain text input
    UIAlertViewStyleLoginAndPasswordInput // Two text fields, one for username and other for password
};

В вашем случае, чтобы использовать это, следуйте этому коду.

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Please enter password"
                                                  message:nil
                                                 delegate:self
                                        cancelButtonTitle:@"Cancel"
                                        otherButtonTitles:@"Continue", nil];
[alert setAlertViewStyle:UIAlertViewStyleSecureTextInput];
[alert show];

Для проверки ввода допустим, что введенный пароль должен содержать не менее 6 символов, реализуйте этот метод делегата,

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView
{
    NSString *inputText = [[alertView textFieldAtIndex:0] text];
    if( [inputText length] >= 6 )
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

Чтобы получить пользовательский ввод

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
    if([title isEqualToString:@"Login"])
    {
        UITextField *password = [alertView textFieldAtIndex:0];
        NSLog(@"Password: %@", password.text);
    }
}

UIAlertView имеет частную иерархию представлений, и рекомендуется использовать ее без изменений. следовательно addSubview: на просмотр предупреждений не повлияет на его просмотр.

Из Apple документов

Класс UIAlertView предназначен для использования как есть и не поддерживает создание подклассов. Иерархия представления для этого класса является закрытой и не должна быть изменена.

UIAlertView с UITextField..

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Alert" message:@" " delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
CGRect frame = CGRectMake(14, 45, 255, 23);
UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.placeholder = @"Name";
textField.backgroundColor = [UIColor whiteColor];
textField.autocorrectionType = UITextAutocorrectionTypeDefault;
textField.keyboardType = UIKeyboardTypeAlphabet;
textField.returnKeyType = UIReturnKeyDone;
textField.clearButtonMode = UITextFieldViewModeWhileEditing; // has 'x' button to the right
[alertView addSubview:textField];

[alertView show];

Предоставлено http://kshitizghimire.com.np/uitextfield-in-uialertview/

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