记DZNEmpetyDataSet 使用中遇到的坑

2018-07-05  本文已影响0人  魏小庄

最近在项目中引入了一个第三方的展示空视图的一个库, DZNEmpetyDataSet 这个库是为scrollView写的一个扩展,可以很方便的设置空视图。但是在使用过程中还是遇到了些坑,

  1. 关于自定义视图问题。我们都知道DZNEmpetyDataSet 提供了很方便的代理设置自定义的文字和图标,但是如果需求更复杂时,可以通过自定义一个view来展示。这里如果直接自定义一个View是无法展示的。
    当时也是懵逼了,进到官方说明也是只有。
- (UIView *)customViewForEmptyDataSet:(UIScrollView *)scrollView
{
    UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [activityView startAnimating];
    return activityView;
}

感觉自己没有使用错误啊,copy官方这段代码。。哎,可以展示菊花。但是return我自定义的View怎么是空白的。郁闷ing..
查看源码,发现内部是使用AutoLayout 来做的约束布局。自定义的View内部的布局是:

 // If applicable, set the custom view's constraints
    if (_customView) {
        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[customView]|" options:0 metrics:nil views:@{@"customView":_customView}]];
        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[customView]|" options:0 metrics:nil views:@{@"customView":_customView}]];
    }
    else {

猜测有可能父视图的frame ,是根据子视图约束的,当前我返回的customView并没有做自身的约束,发现这点后,添加内部子控件约束,限制父视图的宽高。果然就可以显示了。。

  1. 这个问题应该来说不属于DZNEmpetyDataSet但是是在使用的时候发现,所以也就放在这里说一下。
    我们都知道在使用DZNEmpetyDataSet 如果想展示提示图标只需要实现这个代理方法返回一个UIImage对象就可以了。
// 设置图片
- (UIImage *) imageForEmptyDataSet:(UIScrollView *)scrollView {
    return [UIImage imageNamed:@"icon_Nonetwork"];
}

但是在实际使用中,我们有些页面是不需要展示图标的。所以我这里改成了这样。

// 设置图片
- (UIImage *) imageForEmptyDataSet:(UIScrollView *)scrollView {
    if (!self.viewModel.errorMessage) return [UIImage new];
    return [UIImage imageNamed:@"icon_Nonetwork"];
}

看着貌似没有什么问题吧。
但是,在项目上线之后,发现忽然增加了很多的线上崩溃,都是定位在这里,都是坏内存访问。

   view.verticalSpace = [self dzn_verticalSpace];
            
            // Configure Image
            if (image) {
                if ([image respondsToSelector:@selector(imageWithRenderingMode:)]) {
                    view.imageView.image = [image imageWithRenderingMode:renderingMode];
                    view.imageView.tintColor = imageTintColor;
                }
                else {
                    // iOS 6 fallback: insert code to convert imaged if needed
                    view.imageView.image = image;
                }
            }

又是一阵懵逼,怎么可能啊,,,什么情况。
经过层层的排查,最后定位到是外部 返回[UIImage new]这个方法造成的。但是在我们测试时并没有崩溃啊,最后发现,在ios 11.3 -- 11.4 是没有问题的,但是11.0 之后的老的系统,如果是通过[UIImage new] 这个方法创建的image对象,是不能调用imageWithRenderingMode 这个方法的。但是在11.3之后,苹果爸爸貌似又修复了这个问题。查看了下官方文档也没发现什么说明的。只在网上看到了这句话。

QQ20180705-222809@2x.png

真的是人生处处都是坑啊,一不小心就栽个狗吃屎。。搬砖不易,且行且珍惜。

上一篇下一篇

猜你喜欢

热点阅读