我也玩下runtime(干货)

作者: APP叫我取个帅气的昵称 | 来源:发表于2017-04-14 11:36 被阅读194次

关于runtime的介绍这里就不做记录了,简书内搜索 “runtime”一大堆。曽看到过一篇介绍runtime的文章,末尾写了一句话:用runtime如果不是为了装X,那将毫无意义。那么今天,我就装一回,用一个实际的需求(每个项目都能用到哦)来验证runtime的作用之一 ,给分类动态添加属性。

需求:当网络连接错误或者接口返回 code= 0 的时候,页面如下:


网络请求失败.png

有人说了,嗨,就这个需求......的确,就这个需求,但今天是通过runtime来实现。

1.准备工作:准备一个xib视图

NoNetWorkView.xib.png

2 新建一个UIView的分类 UIView+State
UIView+State.h 文件代码如下

#import <UIKit/UIKit.h>

@protocol UIViewStateDelegate <NSObject>
@optional
- (void)xs_noNetWorkViewStateShouldChnaged; //点击刷新页面代理
@end

@interface UIView (State)

@property (weak, nonatomic) id<UIViewStateDelegate> stateDelegate;

- (void)xs_switchToNoNetWorkState;//当网络连接错误时加载NoNetworkView

- (void)xs_switchToContentState;//当网络连接正常时移除NoNetworkView

@end

UIView+State.m文件代码如下

#import "UIView+State.h"
#import <objc/runtime.h>//必须导入

@interface UIView ()
@property (strong, nonatomic) UIView *noNetworkView;//添加属性
@end

@implementation UIView (State)

- (void)xs_switchToNoNetWorkState {
    if (self.noNetworkView == nil) {
        self.noNetworkView = [[[NSBundle mainBundle] loadNibNamed:@"NoNetWorkView" owner:nil options:nil] objectAtIndex:0];
    }
    [self addSubview:self.noNetworkView];
    [self bringSubviewToFront:self.noNetworkView];
    self.noNetworkView.frame = self.bounds;

    if (self.stateDelegate && [self.stateDelegate respondsToSelector:@selector(xs_noNetWorkViewStateShouldChnaged)]) {
        self.noNetworkView.userInteractionEnabled = YES;
        [self.noNetworkView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.stateDelegate action:@selector(xs_noNetWorkViewStateShouldChnaged)]];//添加点击手势
    }
}


- (void)xs_switchToContentState {
    [self.noNetworkView removeFromSuperview];
}

#pragma mark - getters and setters
//关联
//objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略
static char stateDelegateKey;
- (id<UIViewStateDelegate>)stateDelegate {
    return objc_getAssociatedObject(self, &stateDelegateKey);
}

- (void)setStateDelegate:(id<UIViewStateDelegate>)stateDelegate {
    objc_setAssociatedObject(self, &stateDelegateKey, stateDelegate, OBJC_ASSOCIATION_ASSIGN);
}

static char noNetWorkViewKey;
- (UIView *)noNetworkView {
    return objc_getAssociatedObject(self, &noNetWorkViewKey);
}

- (void)setNoNetworkView:(UIView *)noNetworkView {
    objc_setAssociatedObject(self, &noNetWorkViewKey, noNetworkView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

3.UIView+State 分类的使用

3.1在controller.m中 先导入文件

#import "UIView+State.h"

3.2 遵循代理

@interface ZLMComplainListViewController ()<UIViewStateDelegate>

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.stateDelegate = self;
  }

3.3 在适当条件下调分类方法

-(void)loadData:(NSInteger )page{
    NSString *urlStr = [NSString stringWithFormat:@"%@/complaint/list", host];
    NSDictionary *param = @{
                           @"page":@(page)
                           };

    if (page == 1) {
        [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    }
    
    XSAPIManager *manager = [XSAPIManager manager];

    [manager GET:urlStr parameters:param success:^(id responseObject) {
        
        self.complainListBridge  = [ComplainList mj_objectWithKeyValues:responseObject];//将json数据映射到model中
      
        if (self.complainListBridge.code == 1) {
            
            [self.view xs_switchToContentState];//如果网络请求成功并返回code=1,移除网络连接错误的视图

        } else {
            [self.view xs_switchToNoNetWorkState];//返回code= 0  ,加载网络连接的视图
        }
       [self.tableview reloadData];
       
        [MBProgressHUD hideAllHUDsForView:weakSelf.view animated:YES];
    } failure:^(NSError *error) {
        [MBProgressHUD hideAllHUDsForView:weakSelf.view animated:YES];
         [self.view xs_switchToNoNetWorkState];//网络连接错误 ,加载网络连接的视图
        
    }];

}

3.4 实现代理方法 点击刷新

#pragma mark - UIViewStateDelegate
- (void)xs_noNetWorkViewStateShouldChnaged {
    [self loadData:1];
}

通过以上介绍,是不是可以举一反三呢?当没收藏列表中没收藏,地址列表中没地址,订单列表中没订单等等等等,赶紧用起来吧。

以上。

相关文章

  • 我也玩下runtime(干货)

    关于runtime的介绍这里就不做记录了,简书内搜索 “runtime”一大堆。曽看到过一篇介绍runtime的文...

  • Runtime详解

    最近在研究Runtime,因此,打算写一篇文章跟小伙伴儿们分享一下。好了,废话不多说,直接上干货。 RunTime...

  • 我也来玩一下

  • Runtime底层原理分析之objc_megSend

    一、前言 最近我想要研究一下 Runtime 的底层原理,于是下载了一份 runtime 的源码,学习的过程中也查...

  • ios中runtime分析

    大家好,今天给大家分享下对于runtime 的理解 ,网上关于runtime 的介绍非常多,内容也各种各样...

  • 敦煌游记(纯干货)

    看大家都有写各种有关敦煌的东西,我也单纯的说一下怎么去敦煌玩。尽量少说废话,多干货。 去敦煌,首先看你啥时候去,一...

  • 关于type encodings的理解--runtime pro

    runtime programming guide 这次准备好好研究下runtime programming, 先...

  • runtime - api介绍

    runtime api 介绍 玩一下常用的api objc_系列函数关注于宏观使用,如类于协议的空间分配,注册,注...

  • 总结用到RUNTime的实例

    项目结束了,总结一下我用到RUNTime的地方,和大家讨论一下。主要在一下几个方面用到了RUNTime。 1.保存...

  • 使用反射重构代码(OC)

    前沿 OC里的runtime就是Java里反射的概念。关于OC中runtime的应用早就被玩烂了, 今天介绍关于用...

网友评论

    本文标题:我也玩下runtime(干货)

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