zoukankan      html  css  js  c++  java
  • 保存对象的不同状态值

    保存对象的不同状态值

    效果

    说明

    1. 存储不同的状态,对于一个对象而言还是很有必要的,尤其是需要频繁切换状态的时候.

    2. block是对象,是可以存储在集合中的.

    源码

    https://github.com/YouXianMing/ViewState

    //
    //  NSObject+StatePattern.h
    //  ViewState
    //
    //  Created by YouXianMing on 15/6/30.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    typedef void(^NSObjectBlock_t)(id object);
    
    @interface NSObject (StatePattern)
    
    /**
     *  存储状态的字典
     */
    @property (nonatomic, strong, readonly) NSMutableDictionary  *stateDictionary;
    
    /**
     *  注册状态
     *
     *  @param stateString 状态标签值
     *  @param stateBlock  保存状态的block
     */
    - (void)registerState:(NSString *)stateString stateBlock:(NSObjectBlock_t)stateBlock;
    
    /**
     *  切换到指定标签的状态
     *
     *  @param stateString 状态标签值
     */
    - (void)switchToState:(NSString *)stateString;
    
    @end
    //
    //  NSObject+StatePattern.m
    //  ViewState
    //
    //  Created by YouXianMing on 15/6/30.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import "NSObject+StatePattern.h"
    #import <objc/runtime.h>
    
    @implementation NSObject (StatePattern)
    
    
    - (void)registerState:(NSString *)stateString stateBlock:(NSObjectBlock_t)stateBlock {
    
        [self setup];
        
        [self.stateDictionary setObject:stateBlock forKey:stateString];
    }
    
    
    - (void)switchToState:(NSString *)stateString {
    
        [self setup];
        
        NSObjectBlock_t block = [self.stateDictionary objectForKey:stateString];
        
        if (block) {
            
            __weak id weakSelf = self;
            block(weakSelf);
        }
    }
    
    
    - (void)setup {
        
        if (self.stateDictionary == nil) {
            self.stateDictionary = [NSMutableDictionary dictionary];
        }
    }
    
    
    #pragma mark - runtime属性
    @dynamic stateDictionary;
    NSString * const _recognizerStateDictionary = @"_recognizerStateDictionary";
    
    - (void)setStateDictionary:(NSMutableDictionary *)stateDictionary {
        
        objc_setAssociatedObject(self, (__bridge const void *)(_recognizerStateDictionary), stateDictionary, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSMutableDictionary *)stateDictionary {
        
        return objc_getAssociatedObject(self, (__bridge const void *)(_recognizerStateDictionary));
    }
    
    
    @end

    注意

  • 相关阅读:
    exchart点击事件,空白无值也能点击触发
    两个界面来回切换展示(左下角 有小demo)
    警告滚动展示
    Oracle高级查询之OVER (PARTITION BY ..)
    解决安装office2007后,原来的*.doc文件的图标变成缩略图
    几个常用的文本处理shell 命令:find、grep、sort、uniq、sed、awk
    CentOS 7.3 安装配置 Nginx
    MySQL5.7.17源码编译安装与配置
    CentOS 7 源码安装 MySQL5.7
    Java命令学习系列(一)——Jps
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4611942.html
Copyright © 2011-2022 走看看