前些天, 被项目中的一个bug困扰许久, 当时陷入死循环, 怎么也想不明白, 其实经验表明, 越是这种bug, 一般也就越没什么, 解决了的时候越觉得自己是个SB, 所以显而易见这次也是属于这种bug, 就拿出来记录一下, 其他人万一遇到也好提个醒
先上图, 也许有人一眼就看出来了, 解决之后我也是觉得太傻叉, 这都没想到。
123.gif 456.gif
症状描述:
流程:
1,登陆界面
2,输入账号密码,检查无误,点击确认按钮,textField注销第一响应者, 弹窗菊花HUD, 发出请求
3,回调成功,去掉菊花HUD, 显示服务器返回的信息, demo中为@“请求成功”
症状:服务器回调的“请求成功”,应显示两秒, 此处一闪就没了
或者如果回调比较慢就是另一种症状, 菊花很快就没了, 一段空白时间之后才显示两秒的“请求成功”
解决:
解决过程是如何想偏方向的就不说了, 直接说问题吧, 接手公司的项目, 之前用了MJ封装的MBProgressHUD分类, 代码中部分如下:
+ (void)show:(NSString *)text icon:(NSString *)icon view:(UIView *)view
{
if (view == nil) view = [[UIApplication sharedApplication].windows lastObject];
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES];
hud.detailsLabelText = text;
hud.detailsLabelFont = [UIFont systemFontOfSize:15];
hud.mode = MBProgressHUDModeText;
hud.removeFromSuperViewOnHide = YES;
[hud hide:YES afterDelay:2.0f];
}
demo中控制器内代码如下:
- (IBAction)confirmClick:(UIButton *)sender {
[self.textField resignFirstResponder];
if (self.textField.text.length == 0) {
[MBProgressHUD showError:@"请输入账号"];
return;
}
[MBProgressHUD showMessage:nil];
//模拟回调
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self callBackSuccess];
});
}
- (void)callBackSuccess {
[MBProgressHUD hideHUD];
[MBProgressHUD showSuccess:@"请求成功"];
}
直接说问题
键盘弹窗的时候会再创建两个window, 打印出来如下:
2016-08-06 22:06:37.691 MBAndKeyBoardConflict[36736:6309111] 键盘退出后windows : (
"<UIWindow: 0x7f81cac2cec0; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x7f81cac2e210>; layer = <UIWindowLayer: 0x7f81cac2aaf0>>",
"<UITextEffectsWindow: 0x7f81cae2d790; frame = (0 0; 320 568); autoresize = W+H; layer = <UIWindowLayer: 0x7f81cae21ff0>>",
"<UIRemoteKeyboardWindow: 0x7f81cad2a0a0; frame = (0 0; 320 568); hidden = YES; autoresize = W+H; layer = <UIWindowLayer: 0x7f81cad2c7a0>>"
)
在看MJ封装的MB的分类, 如果不指定View, 取出windows里的最后一个, 最后一个就是UIRemoteKeyboardWindow
这个鬼, 这个鬼键盘退出后就没了, 正是由于把菊花和提示信息都加在了这个鬼上, 所以一闪就没了
if (view == nil)
view = [[UIApplication sharedApplication].windows lastObject];
至于如何修改, 很简单啊,改成keyWindow就可以了。。。
if (view == nil)
view = [UIApplication sharedApplication].keyWindow;
至此也就没啥可说的了。。。
网友评论