美文网首页IOS开发iOSiOS开发
ios项目开发中遇到的坑(二)

ios项目开发中遇到的坑(二)

作者: mark666 | 来源:发表于2016-05-19 10:51 被阅读2183次

这篇文章主要分享一下最近项目中遇到的问题和实际的解决方案的分享,还有一款小插件的分享,希望对遇到同类问题的作者有所帮助。

问题一

  • 使用WebView加载网页时候进行加载时候,如果出现网络请求缓慢,并且使用MBProgressHub进行动画处理,会出现以下情形:
  • 情形一:使用[MBProgressHub showMessage:""]
    使用这个方法你会出现这个情况
    整个屏幕被覆盖

这样的话用户无法操作,只能杀死程序重新开启程序,用户体验极差

  • 情形二:使用[MBProgressHub showMessage:@"" toView:self.view]
    只覆盖导航栏以下的屏幕
    这样体验较情形一较好,用户可以使用返回键返回,体验一般般。

针对这个问题首先想到的是WebView有没有个属性可以提供我设置超时请求,找了一遍没有,那么WebView load 是一个request,那么肯定有设置请求超时的操作,果然发现以下方法

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:_webViewUrl] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0];

webView的代理方法中

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    NSLog(@"%@",error.userInfo);
    [MBProgressHUD hideHudWithMessageError:error.userInfo[@"NSLocalizedDescription"]];
    [MBProgressHUD hideHUDForView:_webView];
    
}

这样的就处理webView中的超时请求

提示请求超时

问题二

  • 定时器NSTimer使用出现的问题:在做获取验证码操作时候倒计时出现负数,原因未能正确处理定时器造成。
-(void)setUpTimer
{
    self.timeLable.text = @"59s";
    self.sendBtn.hidden = YES;
    self.timeLable.hidden = NO;
    self.timeIndex = 59;
    
    //设置定时器
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(elapsedTimer) userInfo:nil repeats:YES];
//这句代码非常重要,否则会造成未知的错误
    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
}
//执行倒数器
-(void)elapsedTimer
{
    self.timeIndex = self.timeIndex - 1;
    if (self.timeIndex < 0) {
        self.timeLable.hidden = YES;
        self.sendBtn.hidden = NO;
        [self timerEndRunning];
    }else
    {
        self.timeLable.text =[NSString stringWithFormat:@"%ds",self.timeIndex];
    }
}

// 结束倒数器
- (void)timerEndRunning
{
    if (self.timer != nil) {
        [self.timer invalidate];
        self.timer = nil;
    }
}

在处理发送验证码按钮发送后显示暗色有两种方法,第一种将按钮设置为不能点击然后将按钮的背景色设置为灰色,第二种是创建按钮的时候设置图片的UIControlStateDisabled下的图片,以上两种的都可以。

你以为上面定时器就处理完成了吗?当你销毁界面的时候,你会发现delloc并未调用,实际上当控制器出栈的时候,并未销毁,什么原因呢,原因是你在发送验证码倒计时过程的定时器并未销毁和停止!!!
所以正确的逻辑应该是:

- (void)viewDidDisappear
{
  if(self.timer != nil)
  [self.timer invalid];
   self.timer = nil;
}

记得一定先invalidnil,否则你会后悔的。

最后给大家分享一个模拟低网速的插件,其实苹果官方已经给我们提供了这样的插件,我们去苹果官网下载就可以了

具体地址见下图:

请点击More Developer Tools...

这个地址是需要账号登录的,没有的伙伴申请一个即可。


红线部分即需要下载工具

个人点击下载最新的Xcode 7.3告诉我没有权限,所以我就下载了7.1,前提说明我的Xcode是7.3,安装后正常使用。

红色下划线的插件

点开后

点击Mangerprofiles选择你需要的场景

这样就可以在模拟器上模拟相应的网络状态了。

问题三 (补充)

更新于2016.6.21日

我们会遇到这种问题:

这种是使用[UIImage imageName:]这个方法未找到对应的图片引起的,如果是一个新的项目是不会出现这个问题的,因为你的图片你都是确定的,当我们要套用旧的项目开始一个新的项目的时候最容易出现,但是我们不可能一一去找到底在哪里,给大家分享一个简易的方法。

增加一个方法的断点,运行项目查找,更改后重新运行,问题就会消失。

  • 千万别打赏我,我害羞。。。。

相关文章

网友评论

  • Society2012:这情况我也碰到过,看到你的blog,这个问题解决了
  • 十一岁的加重:问题三 (补充)
    还有可能是sb中,xib中使用了的图片,被删了
  • 小凡凡520:楼主 插件怎么个使用的
    mark666: @小凡凡520 选择你需要场景后on
  • faterman:应该是定义一个可见进度条,然后定义超时时间,显示刷新按钮。
    mark666: @faterman 这根据产品来确定,你说的是另外一种处理网络的情形
  • 五分钟学算法:🤗
    五分钟学算法:@mark666 打赏 :moneybag:(逃
    mark666:@菠萝的菜 为什么不打赏呢
  • Mellong:嗯,为了不让你害羞,我决定不打赏你了
    mark666:@Mellong 你们这样不好吧,动力都没有了,(三)没办法写下去了。。。
  • 勤奋的笨老头:第一个问题,使用UIActivityIndicatorView可能会更理想,简书的loading
    mark666:@勤奋的笨老头 一般我们更倾向于使用gitHub上星较高的第三库,像MBProgressHub,SVProgressHub 等等,当然你也可以使用UIActivityIndicatorView来封装,这个以前我也封装过,很简单
  • 我系哆啦:嗯,为了不让你害羞,我决定不打赏你了
    mark666:@我系哆啦 好主意
  • huiyuM:还可以,一起加油!
  • 路路有话说:嗯,为了不让你害羞,我决定不打赏你了
    mark666: @sololi 嘿嘿

本文标题:ios项目开发中遇到的坑(二)

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