直接附上源代码:
<UIResponder+Transfer . h>
#import
<UIKit/UIKit.h>
@interface UIResponder (Transfer)
/**
* 发送一个待响应消息, 对eventName感兴趣的 UIResponsder 可以对消息进行处理
* 注意 如果对传过来的消息不处理,需要传递给下一个响应
* @param eventName 发生的事件名称
* @param userInfo 传递消息时, 携带的数据, 数据传递过程中, 可以有新的数据添加
*
*/
- (void)transferEventWithName:(NSString *)eventName userInfo:(NSDictionary *)userInfo;
/**
* 发送一个待响应消息给指定的响应者
*
* @param response 响应者类名class 类名str
* @param selector 响应方法str 无参
*/
- (void)transferEventToResponse:(id)response responseSelector:(NSString *)selector;
/**
* 发送一个待响应消息给指定的响应者
*
* @param response 响应者类名class 类名str
* @param selector 响应方法str 带参数
* @param args 带一个参数包装成字典
*/
- (void)transferEventToResponse:(id)response responseSelector:(NSString *)selector withArgument:(NSDictionary *)args;
@interface UIResponder (Transfer)
/**
* 发送一个待响应消息, 对eventName感兴趣的 UIResponsder 可以对消息进行处理
* 注意 如果对传过来的消息不处理,需要传递给下一个响应
* @param eventName 发生的事件名称
* @param userInfo 传递消息时, 携带的数据, 数据传递过程中, 可以有新的数据添加
*
*/
- (void)transferEventWithName:(NSString *)eventName userInfo:(NSDictionary *)userInfo;
/**
* 发送一个待响应消息给指定的响应者
*
* @param response 响应者类名class 类名str
* @param selector 响应方法str 无参
*/
- (void)transferEventToResponse:(id)response responseSelector:(NSString *)selector;
/**
* 发送一个待响应消息给指定的响应者
*
* @param response 响应者类名class 类名str
* @param selector 响应方法str 带参数
* @param args 带一个参数包装成字典
*/
- (void)transferEventToResponse:(id)response responseSelector:(NSString *)selector withArgument:(NSDictionary *)args;
@end
<UIResponder+Transfer . m>
#import
"UIResponder+Transfer.h"
@implementation UIResponder (Transfer)
- (void)transferEventWithName:(NSString *)eventName userInfo:(NSDictionary *)userInfo {
//传递给下一个响应者
[self.nextResponder transferEventWithName:eventName userInfo:userInfo];
}
- (void)transferEventToResponse:(id)response responseSelector:(NSString *)selector {
SEL sel = NSSelectorFromString(selector);
id res = [self findResponse:response];
if (res) {
if ([res respondsToSelector:sel]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[res performSelector:sel withObject:nil];
#pragma clang diagnostic pop
}
}
}
- (void)transferEventToResponse:(id)response responseSelector:(NSString *)selector withArgument:(NSDictionary *)args {
SEL sel = NSSelectorFromString(selector);
id res = [self findResponse:response];
if (res) {
if ([res respondsToSelector:sel]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[res performSelector:sel withObject:args];
#pragma clang diagnostic pop
}
}
}
- (id)findResponse:(id)response {
Class c;
if ([response isKindOfClass:[NSString class]]) {
c = NSClassFromString(response);
}else {
c = (Class)response;
}
UIResponder *nextResponse = self;
do {
nextResponse = nextResponse.nextResponder;
if (nextResponse == nil) {
return nil;
}
} while (![nextResponse isKindOfClass:c]);
return nextResponse;
}
@implementation UIResponder (Transfer)
- (void)transferEventWithName:(NSString *)eventName userInfo:(NSDictionary *)userInfo {
//传递给下一个响应者
[self.nextResponder transferEventWithName:eventName userInfo:userInfo];
}
- (void)transferEventToResponse:(id)response responseSelector:(NSString *)selector {
SEL sel = NSSelectorFromString(selector);
id res = [self findResponse:response];
if (res) {
if ([res respondsToSelector:sel]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[res performSelector:sel withObject:nil];
#pragma clang diagnostic pop
}
}
}
- (void)transferEventToResponse:(id)response responseSelector:(NSString *)selector withArgument:(NSDictionary *)args {
SEL sel = NSSelectorFromString(selector);
id res = [self findResponse:response];
if (res) {
if ([res respondsToSelector:sel]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[res performSelector:sel withObject:args];
#pragma clang diagnostic pop
}
}
}
- (id)findResponse:(id)response {
Class c;
if ([response isKindOfClass:[NSString class]]) {
c = NSClassFromString(response);
}else {
c = (Class)response;
}
UIResponder *nextResponse = self;
do {
nextResponse = nextResponse.nextResponder;
if (nextResponse == nil) {
return nil;
}
} while (![nextResponse isKindOfClass:c]);
return nextResponse;
}
@end
这篇博客介绍了UIResponder的响应链方法,包括如何发送和处理事件。通过`transferEventWithName:userInfo:`方法,事件被传递给下一个响应者,而`transferEventToResponse:responseSelector:`系列方法则允许指定响应者并调用相应的方法来处理事件。代码实现中包含了寻找指定响应者并执行相应方法的逻辑。
7783

被折叠的 条评论
为什么被折叠?



