使用最新的iOS 8.3版本,我们的应用程序开始出现奇怪的行为。
完成文本字段编辑后,用户可以单击关闭按钮,显示UIAlertView
。当用户在alertview中单击 discard 时,将取消警报视图和当前视图。但不知何故,键盘在视图消失后显示出来,这对用户来说非常烦人。
经过一些调试后,似乎键盘显示的是用户在关闭视图之前访问过的最后一个文本字段。在点击endEditing
中的按钮之后,我尝试了UIAlertView
在许多地方的当前视图的各种方式(在显示UIAlertView
之前;我甚至将焦点设置为视图的另一个UI元素)。它没有解决问题。
但对于这个特殊问题,我不确定这是一个常见问题还是我们需要解决的问题。在iOS 8.3之前,一切都运行良好。
我们了解iOS 8已弃用UIAlertView
。我们已开始迁移到UIAlertController
。但如果有任何解决方法,我们很乐意听到。
这是一些代码段。
- (IBAction)closeTapped:(UIButton *)sender
{
// try to resign first responder
// [self.tfName resignFirstResponder];
// [self.tfPosition resignFirstResponder];
[self.view endEditing:YES];
if(self.orderDetails.isOpen && self.orderItemChanged)
{
UIAlertView* saveAlert = [[UIAlertView alloc] initWithTitle:@"Unsaved Changes"
message:@"Your changes have not been saved. Discard changes?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Save", @"Discard", nil];
[saveAlert show];
}
else
{
[self close];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
switch(buttonIndex)
{
case 1: // Save
{
[self save];
break;
}
case 2: // Discard
{
[self close];
break;
}
}
}
- (void)close
{
[self.delegate dismissEditOrderItemVC];
}
答案 0 :(得分:14)
如果您的部署目标是iOS 8+,请尝试UIAlertController
。
这里是UIAlertView
的快速修复:当文本字段或文本视图撤消第一响应者时,延迟调用显示警报视图。
[self performSelector:@selector(showAlertView) withObject:nil afterDelay:0.6];
答案 1 :(得分:3)
如果有人在努力解决这个问题,我希望这会有所帮助:
if (NSClassFromString(@"UIAlertController")) {
UIAlertController* alert = ...
}
else {
UIAlertView* alert = ...
}
答案 2 :(得分:2)
您需要更改ios 8.3的警报
首先将此视图放在您的视图中
#define IS_IOS8 [[UIDevice currentDevice].systemVersion floatValue] >= 8.0
然后
if (IS_IOS8) {
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Unsaved Changes" message:@"Your changes have not been saved. Discard changes?" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *saveAction = [UIAlertAction
actionWithTitle:@"Save"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
[self save];
}];
UIAlertAction *cancelAction = [UIAlertAction
actionWithTitle:@"Cancel"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
[alertVC dismissViewControllerAnimated:YES completion:nil];
}];
UIAlertAction *discardAction = [UIAlertAction
actionWithTitle:@"Discard"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
[alertVC dismissViewControllerAnimated:YES completion:nil];
}];
[alertVC addAction:saveAction];
[alertVC addAction:cancelAction];
[alertVC addAction:discardAction];
[self.view.window.rootViewController presentViewController:alertVC animated:YES completion:nil];
这会帮助你,因为它可以帮助我解决同样的问题。 以上代码兼容ios 7& 8
答案 3 :(得分:2)
我也是,在关闭UIAlertController后弹出一个键盘(光标位于最后使用的textView中),这是一个非常简单的修复:
在构建和展示UIAlertController之前,
使用[_activeTextView resignFirstResponder];键盘将重新出现。 使用[self.view endEditing:YES];键盘不会再出现。
我希望这会对你有所帮助。
答案 4 :(得分:1)
如果文本字段是第一个响应者,它将在警报解除时自动弹出键盘。确保第一响应者被正确解雇:
[textField resignFirstResponder]
请记住:在表格或滚动视图中,有时必须在屏幕上显示该字段才能正确关闭响应者。
如果没有第一响应者处于活动状态,则在取消警报时不应出现键盘。
对于这个问题中的特定情况,我建议设置一个委托方法来监听"完成"按钮并在委托回调中重新启动第一个响应者。
或者,在开始编辑时,您可以存储对当前活动文本字段的引用,然后存储在" clickedButtonAtIndex"如果活动文本字段仍处于活动状态,您可以将其重新签名。
答案 5 :(得分:1)
尝试使用以下代码。它适用于iOS 8及以下版本
if (IS_OS_8_OR_LATER) {
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction
actionWithTitle:@"OK"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action)
{
}];
[alertVC addAction:cancelAction];
[[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{
}];
}
else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
}
}
答案 6 :(得分:0)
我注意到textField键盘和alertViews也有一些奇怪的行为......也许做一个名为disableKeyboard的bool并像这样使用它:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
if (disableKeyBoard) {
disableKeyboard = NO;
return NO;
} else {
return YES;
}
}
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {
disableKeyboard = YES;
}
这只是一种解决方法,并没有解决核心问题,无论它是什么。要使此方法起作用,您需要在标题中设置alertView和textField委托方法。