কোনও ইউআইবুটনে @ নির্বাচক যুক্তির জন্য একটি উদ্দেশ্য-সি ব্লকটি পাস করা কি সম্ভব?
ইতিমধ্যে সরবরাহিত সমস্ত উত্তর গ্রহণ করে উত্তরটি হ্যাঁ তবে কয়েকটি বিভাগ সেটআপ করার জন্য একটি সামান্য কাজ প্রয়োজন।
আমি এনএসআইভোকেশনটি ব্যবহার করার পরামর্শ দিচ্ছি কারণ আপনি এটির সাহায্যে টাইমারের সাহায্যে, কোনও বস্তু হিসাবে সঞ্চিত এবং অনুরোধ করা ... ইত্যাদি ...
এখানে আমি যা করেছি তা এখানে রয়েছে তবে নোট করুন যে আমি এআরসি ব্যবহার করছি।
এনএসবজেক্টে প্রথমটি একটি সহজ বিভাগ:
.হ
@interface NSObject (CategoryNSObject)
- (void) associateValue:(id)value withKey:(NSString *)aKey;
- (id) associatedValueForKey:(NSString *)aKey;
@end
.ম
#import "Categories.h"
#import <objc/runtime.h>
@implementation NSObject (CategoryNSObject)
#pragma mark Associated Methods:
- (void) associateValue:(id)value withKey:(NSString *)aKey {
objc_setAssociatedObject( self, (__bridge void *)aKey, value, OBJC_ASSOCIATION_RETAIN );
}
- (id) associatedValueForKey:(NSString *)aKey {
return objc_getAssociatedObject( self, (__bridge void *)aKey );
}
@end
এর পরে একটি ব্লকে সংরক্ষণ করার জন্য এনএসআইভোকেশন এ একটি বিভাগ:
.হ
@interface NSInvocation (CategoryNSInvocation)
+ (NSInvocation *) invocationWithTarget:(id)aTarget block:(void (^)(id target))block;
+ (NSInvocation *) invocationWithSelector:(SEL)aSelector forTarget:(id)aTarget;
+ (NSInvocation *) invocationWithSelector:(SEL)aSelector andObject:(__autoreleasing id)anObject forTarget:(id)aTarget;
@end
.ম
#import "Categories.h"
typedef void (^BlockInvocationBlock)(id target);
#pragma mark - Private Interface:
@interface BlockInvocation : NSObject
@property (readwrite, nonatomic, copy) BlockInvocationBlock block;
@end
#pragma mark - Invocation Container:
@implementation BlockInvocation
@synthesize block;
- (id) initWithBlock:(BlockInvocationBlock)aBlock {
if ( (self = [super init]) ) {
self.block = aBlock;
} return self;
}
+ (BlockInvocation *) invocationWithBlock:(BlockInvocationBlock)aBlock {
return [[self alloc] initWithBlock:aBlock];
}
- (void) performWithTarget:(id)aTarget {
self.block(aTarget);
}
@end
#pragma mark Implementation:
@implementation NSInvocation (CategoryNSInvocation)
#pragma mark - Class Methods:
+ (NSInvocation *) invocationWithTarget:(id)aTarget block:(void (^)(id target))block {
BlockInvocation *blockInvocation = [BlockInvocation invocationWithBlock:block];
NSInvocation *invocation = [NSInvocation invocationWithSelector:@selector(performWithTarget:) andObject:aTarget forTarget:blockInvocation];
[invocation associateValue:blockInvocation withKey:@"BlockInvocation"];
return invocation;
}
+ (NSInvocation *) invocationWithSelector:(SEL)aSelector forTarget:(id)aTarget {
NSMethodSignature *aSignature = [aTarget methodSignatureForSelector:aSelector];
NSInvocation *aInvocation = [NSInvocation invocationWithMethodSignature:aSignature];
[aInvocation setTarget:aTarget];
[aInvocation setSelector:aSelector];
return aInvocation;
}
+ (NSInvocation *) invocationWithSelector:(SEL)aSelector andObject:(__autoreleasing id)anObject forTarget:(id)aTarget {
NSInvocation *aInvocation = [NSInvocation invocationWithSelector:aSelector
forTarget:aTarget];
[aInvocation setArgument:&anObject atIndex:2];
return aInvocation;
}
@end
এটি কীভাবে ব্যবহার করবেন তা এখানে:
NSInvocation *invocation = [NSInvocation invocationWithTarget:self block:^(id target) {
NSLog(@"TEST");
}];
[invocation invoke];
আপনি আমন্ত্রণ এবং মানক উদ্দেশ্য-সি পদ্ধতিগুলি সহ অনেক কিছু করতে পারেন। উদাহরণস্বরূপ, আপনি এনএসআইভোকেশনওপেশন (initWithInvocation :), NSTimer (সময়সূচী টাইমারউইথটাইমইন্টারভাল: অনুরোধ: পুনরাবৃত্তি :) ব্যবহার করতে পারেন
বিন্দুটি আপনার ব্লকটিকে একটি এনএসআইভোকেশনে পরিণত করছে আরও বহুমুখী এবং এটি ব্যবহার করা যেতে পারে:
NSInvocation *invocation = [NSInvocation invocationWithTarget:self block:^(id target) {
NSLog(@"My Block code here");
}];
[button addTarget:invocation
action:@selector(invoke)
forControlEvents:UIControlEventTouchUpInside];
আবার এটি কেবল একটি পরামর্শ।
objc_implementationWithBlock()
এবংclass_addMethod()
সমাধান করতে পারেন (যা বোঝায় হ্যাশ লুক যা পদ্ধতিটির মতো দেখার মতো দক্ষ নয়)। সম্ভবত একটি অপ্রাসঙ্গিক পারফরম্যান্স পার্থক্য, তবে এটি একটি বিকল্প।