美文网首页
被我们忽视的懒加载

被我们忽视的懒加载

作者: StonesMonkey | 来源:发表于2017-05-26 16:59 被阅读69次

         最近去了一家新的公司,代码是外包做的,简直蛋疼,一个UIStoryboard加几百个控制器我就不说了,目前开发只有一些较旧的代码或者外包的代码才会这样,不过日常开发中一些小的细节也很值得我们注意。比如今天我们说的懒加载。
         我认为,在懒加载就是加载控件的地方,至于控件逻辑以及其它属性不应该在懒加载上写
    先看一段代码

    <pre>

    • (UIWebView *)webView{
      if(_webView == nil){
      _webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT - 64)];
      [self.view addSubview:_webView];
      _webView.contentMode = UIViewContentModeScaleAspectFit;
      _webView.delegate = _progressxy;

      }
      return _webView;
      }
      </pre>

    上面我认为有以下几个错误。
    1.懒加载就是当程序要使用的时候才加载,程序不使用的时候不加载。webView直接设置了frame值,这样拿出去就是一个有frame值的webView,就会导致webView的frame值被写死。这里的webView的控制器因为是有NavtivagitionController的,所以会高度减少64个高度。但是我们知道UIController有两个值,一个是self.automaticallyAdjustsScrollViewInsets 另外一个是 self.edgesForExtendedLayout.第一个是控制器是否下降64个高度,也就是默认状态下,控制器在windows的y值是64,edgesForExtendedLayout是上下左右限制 View的初始宽度,所以WebView这样写死frame值明显是不对的。WebView的frame值应该根据和View的大小一致。故而应该在viewWillAppear上加下面代码,而懒加载里边不应该加frame值。

    <pre>

    • (void)viewWillAppear:(BOOL)animated{
      [super viewWillAppear:animated];

      self.webView.frame = self.view.bounds
      }
      </pre>

    第二个问题,就是它设置了webView的代理。_progressxy,_progressxy是一个进度条,其实是webView的一个扩展工具类,这里比较我们就遇到了这个bug,就是webView的代理方法一直都不执行,没错,一直都不执行,并不是工具类的问题,而是在这个时候工具类的初始化是写在Url的set方法里边,而懒加载webView的加载在viewDidload里边,当这个控制器加载的时候,外边就必须设置控制器的frame值,所以这个时候懒加载webView ,_progressxy就是nil,所以代理方法不执行。所以,我依旧建议,在webView里边不要去写任何的逻辑。

    相关文章

      网友评论

          本文标题:被我们忽视的懒加载

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