0

我已经分类UIAlertView并在其中显示了一个textField接受输入的内容。当用户点击textField键盘时,会出现并向上UIAlertView移动以调整键盘。但是当我[textField becomeFirstResponder]didPresentAlertView委托方法中执行时UIAlertView,alertView 不会向上移动以调整键盘。相反,它UIAlertView隐藏在键盘后面。

PS - 我知道 Apple 说不UIAlertView应该被子类化并按原样使用,但我正在子类UIAlertView化,因为我想重新设计 Apple 在其中的默认 UI 元素。

4

2 回答 2

1

你真的不应该做一些违背苹果建议的事情。

原因

  1. 您可能会遇到意想不到的问题,例如您所面临的问题。
  2. 当您违反建议时,您的代码可能会在未来的 iOS 版本中中断。
  3. 重新设计 Apple 的标准控件违反了 HIG 准则。因此,您的应用程序有可能被拒绝。而是使用子类创建自己的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 密码等),因此使用它可以确保您不会遇到您提到的问题。

希望有帮助!

于 2013-08-21T10:16:33.793 回答
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];
 }
于 2013-08-21T09:47:38.213 回答