我已将UIAlertView
子类化,并在其中显示了textField
,其中包含输入。当用户点击textField
时,键盘会显示,UIAlertView
向上移动以调整键盘。但是当我在[textField becomeFirstResponder]
的{{1}}委托方法中执行didPresentAlertView
时,alertView不会向上移动以调整键盘。相反,UIAlertView
隐藏在键盘后面。
PS - 我知道Apple说UIAlertView
不应该被子类化并按原样使用,但我是UIAlertView
的子类,因为我想重新设计Apple的默认UI元素。
答案 0 :(得分:1)
你真的不应该对Apple的推荐做些什么。
原因
UIView
子类。作为替代方案,Apple已在UIAlertView
中为此要求做出了规定。您无需在警报视图中添加文本字段,而是使用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
具有私有视图层次结构,建议不加修改地按原样使用它。如果您使用它来推荐,您将获得意想不到的结果。
UIAlertView类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。
这是即使在iOS默认应用中使用的标准技术(例如:输入Wi-Fi密码等),因此使用此功能可确保您不会遇到类似于您提及的问题。
希望有所帮助!
答案 1 :(得分:0)
我喜欢这样在屏幕上显示文本字段。 :-)希望这对你有帮助。
- (void) textFieldDidBeginEditing:(UITextField *)textField {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.5];
[UIView setAnimationBeginsFromCurrentState:YES];
self.view.frame = CGRectMake(( self.view.frame.origin.x), (self.view.frame.origin.y-50 ), self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
}
- (void) textFieldDidEndEditing:(UITextField *)textField {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.5];
[UIView setAnimationBeginsFromCurrentState:YES];
self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y+50 , self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
}