我想知道这里是否有任何 iOS 开发人员遇到了这个问题,并且可能能够提出解决方案。它涉及 UIKeyboard 的行为,因为它与 UITextView 和 UIAlertView 相关。
在应用程序中,点击 UITextView 会调用 UIKeyboard。在 UITextView 的附件视图中点击一个按钮会调用具有 UIAlertViewStyleLoginAndPasswordInput 样式的 UIAlertView。到目前为止一切都很好。
这是不好的:解除 UIAlertView 会导致 UIKeyboard 动画消失,然后在 UITextView 再次成为第一响应者时返回。期望的行为是跳过动画。在 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: