当键盘出现在becomeFirstResponder上时,UIAlertView不会自动向上滑动

时间:2013-08-21 09:29:26

标签: iphone ios uialertview becomefirstresponder

我已将UIAlertView子类化,并在其中显示了textField,其中包含输入。当用户点击textField时,键盘会显示,UIAlertView向上移动以调整键盘。但是当我在[textField becomeFirstResponder]的{​​{1}}委托方法中执行didPresentAlertView时,alertView不会向上移动以调整键盘。相反,UIAlertView隐藏在键盘后面。

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

2 个答案:

答案 0 :(得分:1)

你真的不应该对Apple的推荐做些什么。

原因

  1. 您可能会面临意外问题,例如您所面临的问题。
  2. 您违反建议时,您的代码可能会因未来的iOS版本而中断。
  3. 重新设计Apple的标准控件违反了HIG指南。因此,您的应用可能会遭到拒绝。相反,使用UIView子类。
  4. 创建自己的

    作为替代方案,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具有私有视图层次结构,建议不加修改地按原样使用它。如果您使用它来推荐,您将获得意想不到的结果。

    来自Apple docs

      

    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];
 }