首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标-C:将大多数消息转发到另一个对象(在运行时)

目标-C:将大多数消息转发到另一个对象(在运行时)
EN

Stack Overflow用户
提问于 2014-06-19 19:06:30
回答 2查看 1K关注 0票数 3

UIView子类

我有一个子类MyView of UIView

这个子类有一个@property UIView * realView

我想做什么

每当一条消息被发送到MyView时,我都希望将其“转发”到self.realView,但很少有消息除外。

例如,在MyView的实现中,我会让这个覆盖:

代码语言:javascript
复制
- (void)setBackgroundColor:(UIColor *)color
{
     [self.realView setBackgroundColor:color] ;
}

不是显式地覆盖所有方法,我可以在运行时自动完成吗?

例外情况

对于某些方法,我希望有一个显式控制。例如:

代码语言:javascript
复制
- (void)setFrame:(CGRect)frame
{
    /* do stuff */
    
    [super setFrame:frame] ;
}
EN

回答 2

Stack Overflow用户

发布于 2014-06-19 19:08:49

与其显式地重写所有方法,我还能在运行时自动完成吗?

您可以实现-forwardInvocation:方法来向其他对象发送任何不可识别的消息。每当对象没有实现传递给它的选择器时,-forwardInvocation就会被调用,这是处理消息的第二次机会。您可以重写它以将消息发送到另一个对象(这几乎是NSProxy所做的),记录消息,等等。

正如@cobbal在下面指出的那样,-forwardInvocation将帮助您处理superview中没有实现的方法,但是它不会处理在superview中实现的方法,因为MyView继承了这些方法的实现。例如,如果您想使用UIView作为UIButton的代理,那么UIButton的所有特定方法都可以由-forwardInvocation:处理,但是由UIView定义的方法不能。为了获得继承方法以外的其他行为,您当然需要重写。在某些情况下,您可以通过从NSObjectUIResponder而不是从UIView派生NSObjectUIResponder来解决这个问题,从而避免继承的UIView实现,但是如果MyView需要成为一个真正的视图,则需要重写每个方法。

如果您想一想,很难想象如果不显式地覆盖每个继承的方法,您的目标是如何实现的。您说您只想转发大多数消息,但是糟糕的运行时如何分辨哪些消息需要转发,哪些消息不需要转发?它所能做的就是为给定的选择器寻找一个方法,如果它找到了,就调用它,或者如果没有找到,就采取一些操作(比如调用-forwardInvocation:)。

更新: @robmayoff指出了-forwardingTargetForSelector:,我没有想到这一点,但在您的情况下可能是一个更好的解决方案。但是,它仍然不能处理需要重定向从超类继承的方法的情况。

票数 4
EN

Stack Overflow用户

发布于 2016-12-26 12:24:22

这是完全可能的。首先,你需要WZProtocolIntercepter。然后使用拦截器作为正常的UIView:

代码语言:javascript
复制
WZProtocolInterceptor* fakeView = [[WZProtocolInterceptor alloc]
                                  initWithInterceptedProtocol:@protocol(TheMethodsForTheMiddleManToHandle)];

fakeView.receiver = self.realView;
fakeView.middleMan = self;
[someViewController.view addSubview:fakeView];

将您想要控制的方法放在TheMethodsForTheMiddleManToHandle

代码语言:javascript
复制
@protocol TheMethodsForTheMiddleManToHandle
- (void)setFrame:(CGRect)frame;
@end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24314468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档