美文网首页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