• 一, Runtime 交换方法


    场景:一般加载图片的时候会有一个placeholder图片,默认图片加载,如果说加载失败就会手动去设置这个默认图片,如果加载图片多,就需要手动加载很多位置

    用runtime机制里面的交换方法,即可省去加载默认图片

    实现思路:UIImage图片有一个imageNamed的方法 我们只需要写一个方法与此来交换,在加载失败的情况默认显示我们那个方法里面的默认图片

    实现步骤:

    1,新建一个Objective - C File 文件 file 规范些category     file type选择Category    class:UIImage 即可

    .h文件需要写一个方法 注意;要与系统的方法区分,加个前缀即可

    如:+ (UIImage *)LL_imageNamed:(NSString *)name;

    .m文件

    #import <objc/message.h> //引入runtime

    load 是只要类所在文件被引用就会被调用 自动调用  只调用一次

    + (void)load{

    //方法交换 就要用Method去拿到系统方法 imageNamed 和  当前手动写的方法LL_imageNamed

    Method imagenameMethod = class_getClassMethod(self,  @selector(imageNamed:));//拿到系统方法

    Method LL_imageNameMethod = class_getClassMethod(self, @selector(LL_imageNamed:));//拿到手动写的方法

    //runtime进行交换即可  完成交换动作

    method_exchangeImplementations(imagenameMethod, LL_imageNameMethod);

    }

    //实现方法

    + (UIImage *)LL_imageNamed:(NSString *)name{

    UIImage *image = [UIImage LL_imageNamed:name];

        if(nil == image){

      //加载失败  在这里做你想做的

            /** 如果图片加载失败 显示默认的图片 **/

            image = [UIImage LL_imageNamed:@"moren.jpg"];

        }

        return image;

    写到这的时候 runtime的交换方法可以写完

    回到vc页面 直接调用

     /** 图片加载失败 通过runtime设置默认图片 **/

        self.showimage = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 40)];

    //imageNamed 已经被我们自己写的方法给替换掉了,这里没有图片的情况下默认显示LL_imageNamed这个里面的图片

        self.showimage.image = [UIImage imageNamed:@""];

        [self.view addSubview:self.showimage];

  • 相关阅读:
    select(Linux 编程)
    Amazon DynamoDB, 面向互联网应用的高性能、可扩展的NoSQL数据库
    键值表
    工厂方法模式之C++实现
    spring(16)------spring的数据源配置
    LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)
    地图之CLLocationManager的使用 定位功能使用
    正则则表达式大全(收集)
    文件的读取和写入(指定路径)
    二维码(带有图片)的生成
  • 原文地址:https://www.cnblogs.com/liaolijun/p/7895683.html
Copyright © 2020-2023  润新知