美文网首页iOS开发技巧iOS DeveloperiOS 开发
MBProgressHUD使用不当与键盘(Keyboard)的冲

MBProgressHUD使用不当与键盘(Keyboard)的冲

作者: CoderLXWang | 来源:发表于2016-08-06 22:28 被阅读705次

前些天, 被项目中的一个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;

至此也就没啥可说的了。。。

相关文章

网友评论

  • f52191993ee3:但是你改成keyWindow后,在有键盘的时候show又被键盘挡住了,除非你设的offset比键盘高,就没有一种为法能够show在键盘上面,然后键盘收起来后又还在界面上的?
    CoderLXWang: @xypng 公司项目,当然没地址了。。。
    f52191993ee3:@CoderLXWang 这篇文章也没有你项目的地址啊?
    CoderLXWang:@xypng 我加了个方法,可以show到最顶层Window + (void)showBriefMsgOnTopWindow:(NSString *)message;
  • 7a946bf5d2ca:楼主的李明杰封装mb分类在哪下载的啊
    7a946bf5d2ca:@CoderLXWang 谢了啊 也搜了 搜到好多版本 就是没有李明杰的 别人的 觉得不完善也不敢用 明杰主页上也没有
    CoderLXWang:@大博哥 我接手项目的时候就有,随便一搜就有啊,比如https://github.com/rookieJX/MBProgressHUD-MJ
  • 7a946bf5d2ca:打赏打赏
  • 7a946bf5d2ca:6的一比 遇到的问题和我一模一样 我正想把最后一个window干掉 但是会影响别的界面 66666
    CoderLXWang: @大博哥 这就好,不用像我一样搞了好几天没想明白
  • queuey:卧槽,我他妈真是SB

本文标题:MBProgressHUD使用不当与键盘(Keyboard)的冲

本文链接:https://www.haomeiwen.com/subject/pqaksttx.html