Ios 如何防止UIKeyboard在关闭UIAlertView后来回设置动画

Ios 如何防止UIKeyboard在关闭UIAlertView后来回设置动画,ios,uitextview,uikeyboard,Ios,Uitextview,Uikeyboard,我想知道这里是否有iOS开发者遇到过这个问题,并且可能会提出一个解决方案。它涉及UIKeyboard与UIExtView和UIAlertView相关的行为 在应用程序中,点击UITextView会调用UIKeyboard。点击UITextView的附件视图中的按钮将调用UIAlertViewStyleLogin和PasswordInput样式的UIAlertView。到目前为止一切都很好 坏消息是:取消UIAlertView会导致UIKeyboard动画消失,然后当UIExtView再次成为第一

我想知道这里是否有iOS开发者遇到过这个问题,并且可能会提出一个解决方案。它涉及UIKeyboard与UIExtView和UIAlertView相关的行为

在应用程序中,点击UITextView会调用UIKeyboard。点击UITextView的附件视图中的按钮将调用UIAlertViewStyleLogin和PasswordInput样式的UIAlertView。到目前为止一切都很好

坏消息是:取消UIAlertView会导致UIKeyboard动画消失,然后当UIExtView再次成为第一响应者时返回。所需的行为是跳过动画。在UIAlertViewDelegate方法中调用[textView becomeFirstResponder]似乎并没有奏效

下面是一个相关的代码片段和日志

对此有何想法

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIBarButtonItem *alertButton = [[UIBarButtonItem alloc] initWithTitle:@"Alert" style:UIBarButtonItemStyleBordered target:self action:@selector(handleAlertButtonTapped:)];
    UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(handleDoneButtonTapped:)];
    UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 44.0)];
    toolbar.barStyle = UIBarStyleBlack;
    toolbar.items = @[alertButton, spacer, doneButton];

    UIView *accessoryView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 44.0)];
    [accessoryView addSubview:toolbar];
    textView.inputAccessoryView = toolbar;

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];

}


- (void)handleAlertButtonTapped:(id)sender {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Styled AlertView"
                                                        message:nil
                                                       delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil, nil];
    [alertView setAlertViewStyle:UIAlertViewStyleLoginAndPasswordInput];
    [alertView show];
}


- (void)handleDoneButtonTapped:(id)sender {
    [textView resignFirstResponder];
}


#pragma mark -
#pragma mark TextView Delegate Methods

- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    return YES;
}


- (void)textViewDidEndEditing:(UITextView *)textView {
    NSLog(@"%@", NSStringFromSelector(_cmd));
}


#pragma mark -
#pragma mark AlertView Delegate methods

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [textView becomeFirstResponder]; // Not a solution.
}

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [textView becomeFirstResponder]; // Not a solution.
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [textView becomeFirstResponder]; // Not a solution.
}


#pragma mark -
#pragma mark Keyboard Notification Methods

- (void)handleKeyboardWillShow:(NSNotification *)notification {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [textView becomeFirstResponder]; // Not a solution.
}


- (void)handleKeyboardDidShow:(NSNotification *)notification {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [textView becomeFirstResponder]; // Not a solution.
}


- (void)handleKeyboardWillHide:(NSNotification *)notification {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [textView becomeFirstResponder]; // Not a solution.
}


- (void)handleKeyboardDidHide:(NSNotification *)notification {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [textView becomeFirstResponder]; // Not a solution.
}
日志的结果是这样的:

ResponderTest[1228:11303] handleKeyboardWillShow:
ResponderTest[1228:11303] handleKeyboardDidShow:
ResponderTest[1228:11303] handleAlertButtonTapped:
ResponderTest[1228:11303] handleKeyboardWillShow:
ResponderTest[1228:11303] handleKeyboardDidShow:
ResponderTest[1228:11303] alertView:clickedButtonAtIndex:
ResponderTest[1228:11303] alertView:willDismissWithButtonIndex:
ResponderTest[1228:11303] handleKeyboardWillHide:
ResponderTest[1228:11303] handleKeyboardDidHide:
ResponderTest[1228:11303] handleKeyboardWillShow:
ResponderTest[1228:11303] handleKeyboardDidShow:
ResponderTest[1228:11303] handleKeyboardWillHide:
ResponderTest[1228:11303] handleKeyboardDidHide:
ResponderTest[1228:11303] handleKeyboardWillShow:
ResponderTest[1228:11303] alertView:didDismissWithButtonIndex:
ResponderTest[1228:11303] handleKeyboardDidShow:

除非我误解了您的应用程序结构,否则您似乎将所有辞职的FirstResponder和成为UIAlertView的FirstResponder的事情复杂化了

基本上你有一个带有用户名和密码字段的UIAlertView是吗

添加带有“完成”按钮的UIToolBar,该按钮具有如下回调方法:

// ------------------------------------------
// Setup keyboard done button as input
// accessory view for your two fields
// ------------------------------------------
UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
[toolBar setBarStyle:UIBarStyleBlackTranslucent];

UIButton *btnDone = [[UIButton alloc] initWithFrame:CGRectMake(230, 4, 66, 35)];
[btnDone setImage:[UIImage imageNamed:@"btnDoneOff.png"] forState:UIControlStateNormal];
[btnDone setImage:[UIImage imageNamed:@"btnDoneOn.png"] forState:UIControlStateHighlighted];

// ------------------------------------------
// Done button calls hideKeyboard method
// when tapped, this is the only place you
// need to call resign first responder
// ------------------------------------------
[btnDone addTarget:self action:@selector(hideKeyboard) forControlEvents:UIControlEventTouchUpInside];

[toolBar addSubview:btnDone];

[btnDone release];

fldUsername.inputAccessoryView = toolBar;
fldPassword.inputAccessoryView = toolBar;


...

// ------------------------------------------
// Resigns first responder for the two fields
// ------------------------------------------
-(void)hideKeyboard
{
    [fldUsername resignFirstResponder];
    [fldPassword resignFirstResponder];
}

这样做,您可以点击用户名字段或密码字段,键盘不应关闭。输入完用户名和密码后,按键盘输入附件视图中的“完成”按钮将隐藏键盘,而不会导致键盘滑入滑出。

对不起,我想我可能把您弄糊涂了。所有那些辞职的FirstResponder/becomeFirstResponder来电者都是为了说明我正在努力克服的问题。事件顺序应为:点击文本视图->键盘启动->点击附件视图上的按钮->UIAlertView显示->关闭UIAlertView->文本字段成为第一响应者避免键盘来回动画。这是这一序列中的最后一步,我正在征求整理意见。我正在寻找将firstResponder返回到textView的方法,以避免键盘来回动画。您是否尝试过使用UIAlertView DidClickButtonIndex委托方法,如果([alertView.title IsequalString:@“myAlertView”]){[desiredField becomeFirstResponder];},是否在其中使用了UIAlertView DidClickButtonIndex委托方法?