gpt4 book ai didi

ios - 如何防止 UIKeyboard 在关闭 UIAlertView 后动画离开和返回

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:46:51 24 4
gpt4 key购买 nike

我想知道这里是否有任何 iOS 开发人员遇到过这个问题并且可以提出解决方案。它涉及 UIKeyboard 的行为,因为它与 UITextView 和 UIAlertView 相关。

在应用程序中,点击 UITextView 会调用 UIKeyboard。点击 UITextView 的附属 View 中的按钮会调用具有 UIAlertViewStyleLoginAndPasswordInput 样式的 UIAlertView。到目前为止一切都很好。

缺点是:关闭 UIAlertView 会导致 UIKeyboard 动画消失,然后随着 UITextView 再次成为第一响应者而返回。所需的行为是跳过动画。在 UIAlertViewDelegate 方法中调用 [textView becomeFirstResponder] 似乎无法解决问题。

在这里is a sample project说明了行为,相关的代码片段和日志发布在下面。

对此有何想法?

- (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:

最佳答案

除非我误解了您的应用程序结构,否则您似乎将所有那些 resignFirstResponder 和 becomeFirstResponder 的 UIAlertView 解雇变得过于复杂。

基本上你有一个带有用户名和密码字段的 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];
}

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

关于ios - 如何防止 UIKeyboard 在关闭 UIAlertView 后动画离开和返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com