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:
на просмотр предупреждений не повлияет на его просмотр.
Класс 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/