2013年2月27日 星期三

Using Category Add New Method And Passing Variables

再看別人的Source中發現了這有趣的東西

objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
objc_getAssociatedObject(id object, const void *key)

因為Category無法使用@property, 搭配上面這兩個方法就可以了
我自己用中文理解的話, 就是用一個Object對應Key來取得所要的value

以UIAlertView來擴充為例
UIAlertView+Category.h
#import <UIKit/UIKit.h>

@interface UIAlertView (Category)
@property (strong, nonatomic) NSString *passVaule; //傳遞的物件
- (NSString *)descriptions;    //擴充的method
@end


UIAlertView+Category.m
#import "UIAlertView+Category.h"
#import <objc/runtime.h>

@implementation UIAlertView (Category)

NSString *const key;

- (void)setPassVaule:(NSString *)passVaule {
   objc_setAssociatedObject(self, &key, passVaule, OBJC_ASSOCIATION_RETAIN);
}
- (NSString *)passVaule {
   return objc_getAssociatedObject(self, &key);
}
- (NSString *)descriptions {
   return @"UIAlertView+Category";
}
@end

在實作的時候, 就可以對Category傳遞參數(passValue)
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Title" message:@"message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];

alertView.passVaule = @"PassValue";
[alertView show];

沒有留言:

張貼留言