UIResponder的响应链方法

这篇博客介绍了UIResponder的响应链方法,包括如何发送和处理事件。通过`transferEventWithName:userInfo:`方法,事件被传递给下一个响应者,而`transferEventToResponse:responseSelector:`系列方法则允许指定响应者并调用相应的方法来处理事件。代码实现中包含了寻找指定响应者并执行相应方法的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接附上源代码:

<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;

@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;
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值