objective-c 无法在 iOS7 上将 UITextField 添加到 UIAlertView...适用于 iOS 6
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18549519/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Unable to add UITextField to UIAlertView on iOS7...works in iOS 6
提问by iTrout
The code below works on iOS6 (and before) but the UITextField does not display in iOS7...any ideas on how to get a UITextField to display in an UIAlterView in iOS7?
下面的代码适用于 iOS6(及之前),但 UITextField 在 iOS7 中不显示......关于如何让 UITextField 在 iOS7 中的 UIAlterView 中显示的任何想法?
UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:self];
[dialog setTitle:@"Enter ESC Score"];
[dialog setMessage:@" "];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
dialog.tag = 5;
nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setKeyboardType:UIKeyboardTypeNumberPad];
[nameField becomeFirstResponder];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 0.0);
[dialog setTransform: moveUp];
[dialog show];
[dialog release];
[nameField release];
Code run for iOS6 displays this:
为 iOS6 运行的代码显示:


same code in iOS7 displays this (notice how UITextField is missing and there is no keyboard):
iOS7 中的相同代码显示了这个(注意 UITextField 是如何丢失的并且没有键盘):


回答by Aaron Brager
You can't easily alter the view hierarchy of a UIAlertView in iOS 7. (Nor should you; the documentation specifically tells you not to.) Head over to the developer forums to see a long discussion about it.
在 iOS 7 中你不能轻易改变 UIAlertView 的视图层次结构。(你也不应该;文档明确告诉你不要这样做。)前往开发者论坛查看关于它的长时间讨论。
One alternative in your case is to set alert.alertViewStyle = UIAlertViewStylePlainTextInput;This will add a text field for you. You can access it in the UIAlertView delegate callback by using UITextField *textField = [alertView textFieldAtIndex:0];.
在您的情况下,另一种选择是设置alert.alertViewStyle = UIAlertViewStylePlainTextInput;这将为您添加一个文本字段。您可以在 UIAlertView 委托回调中使用UITextField *textField = [alertView textFieldAtIndex:0];.
回答by iTrout
@Aaron Brager had the right solution. Additionally I added a line after his suggestion to default a Numeric Keypad.
@Aaron Brager 有正确的解决方案。此外,我在他建议默认数字键盘之后添加了一行。
UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:self];
[dialog setTitle:@"Enter ESC Score"];
[dialog setMessage:@" "];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
dialog.tag = 5;
dialog.alertViewStyle = UIAlertViewStylePlainTextInput;
[dialog textFieldAtIndex:0].keyboardType = UIKeyboardTypeNumberPad;
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 0.0);
[dialog setTransform: moveUp];
[dialog show];
[dialog release];
回答by Manjit Singh
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Credit Card Number"
message:@"Please enter your credit card number:"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Ok", nil];
[alertView setAlertViewStyle:UIAlertViewStylePlainTextInput];
/* Display a numerical keypad for this text field */
UITextField *textField = [alertView textFieldAtIndex:0];
textField.keyboardType = UIKeyboardTypeNumberPad;
[alertView show];
回答by MaxEcho
Just working as charm
就像魅力一样工作
Two UITextField in UIAlertView for all version of iOS
适用于所有 iOS 版本的 UIAlertView 中的两个 UITextField
-(IBAction) showAlertView {
UIAlertView *alert;
UITextField *callForwardNumber;
UItextField *callForwardCondition;
alert = [[UIAlertView alloc] initWithTitle:@"Enter Phone Number & Rule"
message:@""
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Save", nil];
//alert.transform = CGAffineTransformMakeTranslation(0, 110);
callForwardNumber = [[UITextField alloc] init];
callForwardNumber.keyboardType = UIKeyboardTypeNumberPad;
callForwardNumber.text = [R.prefs objectForKey:@"fwd_number"];
callForwardNumber.borderStyle = UITextBorderStyleRoundedRect;
callForwardNumber.delegate = self;
callForwardNumber.tag = 1;
callForwardCondition = [[UITextField alloc] init];
callForwardCondition.text = callCondition;
callForwardCondition.borderStyle = UITextBorderStyleRoundedRect;
callForwardCondition.delegate = self;
callForwardCondition.tag = 2;
[callForwardCondition setKeyboardType:UIKeyboardTypeNumberPad];
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
UIView* customAccessory =
[[UIView alloc] initWithFrame:CGRectMake(0, 0, 250, 55)];
callForwardNumber.frame = CGRectMake(0, 0, 245.0, 25.0);
callForwardCondition.frame = CGRectMake(0, 30.0, 245.0, 25.0);
[customAccessory addSubview:callForwardNumber];
[customAccessory addSubview:callForwardCondition];
[alert setValue:customAccessory forKey:@"accessoryView"];
[alert show];
} else {
alert.message = @"\n\n\n";
[alert show];
callForwardNumber.frame = CGRectMake(20.0, 45.0, 245.0, 25.0);
callForwardCondition.frame = CGRectMake(20.0, 75.0, 245.0, 25.0);
[alert addSubview:callForwardNumber];
[alert addSubview:callForwardCondition];
}
}
回答by Alok kumar
I am also facing same issue, During surfing I got the answer it work for me. I hope it also work for you.
我也面临同样的问题,在冲浪期间我得到了对我有用的答案。我希望它也适合你。
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Folder Name?" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
alertView.tag = 2;
alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
[alertView show];
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
UITextField * alertTextField = [alertView textFieldAtIndex:0];
NSLog(@"alerttextfiled - %@",alertTextField.text);
}
回答by NeverHopeless
You can also give a look to the custom control on cocoacontrols.com. Have a look at MLAertView(ios 7 like UI) and TSAlertView(ios 6 like UI). They can be transformed to a rotation angle as well.
您还可以查看 cocoacontrols.com 上的自定义控件。看看MLAertView(ios 7 like UI) 和TSAlertView(ios 6 like UI)。它们也可以转换为旋转角度。
回答by Svitlana
1) In method
- (id)initWithAlertTitle:(NSString *)title checkForPassword:(NSString *)password
you should add
1)在方法 - (id)initWithAlertTitle:(NSString *)title checkForPassword:(NSString *)password
你应该添加
self.alertViewStyle = UIAlertViewStylePlainTextInput;
sample:
样本:
(id)initWithAlertTitle:(NSString *)title
checkForPassword:(NSString *)password{
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
self.alertViewStyle = UIAlertViewStylePlainTextInput;
}
self = [super initWithTitle:title
message:@"" // password field will go here
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Enter", nil];
if (self) {
self.password = password;
self.hashTechnique = HashTechniqueNone; // use no hashing by default
secondMessage = @"Please Enter New Password";
thirdMessage = @"Please Re-Enter Password";
secondMessageNew = @"Please Enter Password";
}
NSLog(@" _password_ %@",_password);
NSLog(@"_old_password_ %@",[[NSUserDefaults standardUserDefaults] objectForKey:kPassword]);
return self;
}
in method show add next
在方法中显示添加下一个
(void)show {
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
UITextField *passwordField = [self textFieldAtIndex:0];
passwordField.delegate = self;
self.passwordField = passwordField;
}
else
{
UITextField *passwordField = [[UITextField alloc] initWithFrame:CGRectMake(14, 45, 256, 25)];
passwordField.secureTextEntry = YES;
passwordField.placeholder = @"";
passwordField.backgroundColor = [UIColor whiteColor];
// Pad out the left side of the view to properly inset the text
UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 6, 19)];
passwordField.leftView = paddingView;
passwordField.leftViewMode = UITextFieldViewModeAlways;
// // Set delegate
self.passwordField.delegate = self;
// Set as property
self.passwordField = passwordField;
// Add to subview
[self addSubview:_passwordField];
}
// Show alert
[super show];
}
also make changes in method click
还可以更改方法单击
#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
UITextField *passwordField = [self textFieldAtIndex:0];
self.passwordField = passwordField;
}
if (buttonIndex == alertView.firstOtherButtonIndex) {
if ([self enteredTextIsCorrect] || [self.title isEqualToString:secondMessage] || [self.title isEqualToString:secondMessageNew]) {
if (([self.title isEqualToString:secondMessage] || [self.title isEqualToString:secondMessageNew]) && (self.passwordField.text.length > 0)) {
self.password = self.passwordField.text;
self.title = thirdMessage;
self.passwordField.text = @"";
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
if ([self.passwordDelegate respondsToSelector:@selector(notifyParent::)]) {
[self.passwordDelegate notifyParent:thirdMessage:self.password];
}
}
}else
{
if ([self.title isEqualToString:thirdMessage]) {
[[NSUserDefaults standardUserDefaults] setObject:self.password forKey:kPassword];
[[NSUserDefaults standardUserDefaults] synchronize];
if (self.passwordDelegate) {
if ([self.passwordDelegate respondsToSelector:@selector(notifyParentWithState:)]) {
[self.passwordDelegate notifyParentWithState:YES];
}
}
}else{
if ([self.title isEqualToString:secondMessageNew]) {
self.title = secondMessageNew;
}
else{
self.title = secondMessage;
}
self.passwordField.text = @"";
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
if ([self.passwordDelegate respondsToSelector:@selector(notifyParent::)]) {
[self.passwordDelegate notifyParent:self.title:self.password];
}
}
}
}
}
// If incorrect then animate
else {
[self animateIncorrectPassword];
}
}
}

