UIView子类
我有一个子类MyView of UIView。
这个子类有一个@property UIView * realView。
我想做什么
每当一条消息被发送到MyView时,我都希望将其“转发”到self.realView,但很少有消息除外。
例如,在MyView的实现中,我会让这个覆盖:
- (void)setBackgroundColor:(UIColor *)color
{
[self.realView setBackgroundColor:color] ;
}不是显式地覆盖所有方法,我可以在运行时自动完成吗?
例外情况
对于某些方法,我希望有一个显式控制。例如:
- (void)setFrame:(CGRect)frame
{
/* do stuff */
[super setFrame:frame] ;
}发布于 2014-06-19 19:08:49
与其显式地重写所有方法,我还能在运行时自动完成吗?
您可以实现-forwardInvocation:方法来向其他对象发送任何不可识别的消息。每当对象没有实现传递给它的选择器时,-forwardInvocation就会被调用,这是处理消息的第二次机会。您可以重写它以将消息发送到另一个对象(这几乎是NSProxy所做的),记录消息,等等。
正如@cobbal在下面指出的那样,-forwardInvocation将帮助您处理superview中没有实现的方法,但是它不会处理在superview中实现的方法,因为MyView继承了这些方法的实现。例如,如果您想使用UIView作为UIButton的代理,那么UIButton的所有特定方法都可以由-forwardInvocation:处理,但是由UIView定义的方法不能。为了获得继承方法以外的其他行为,您当然需要重写。在某些情况下,您可以通过从NSObject或UIResponder而不是从UIView派生NSObject或UIResponder来解决这个问题,从而避免继承的UIView实现,但是如果MyView需要成为一个真正的视图,则需要重写每个方法。
如果您想一想,很难想象如果不显式地覆盖每个继承的方法,您的目标是如何实现的。您说您只想转发大多数消息,但是糟糕的运行时如何分辨哪些消息需要转发,哪些消息不需要转发?它所能做的就是为给定的选择器寻找一个方法,如果它找到了,就调用它,或者如果没有找到,就采取一些操作(比如调用-forwardInvocation:)。
更新: @robmayoff指出了-forwardingTargetForSelector:,我没有想到这一点,但在您的情况下可能是一个更好的解决方案。但是,它仍然不能处理需要重定向从超类继承的方法的情况。
发布于 2016-12-26 12:24:22
这是完全可能的。首先,你需要WZProtocolIntercepter。然后使用拦截器作为正常的UIView:
WZProtocolInterceptor* fakeView = [[WZProtocolInterceptor alloc]
initWithInterceptedProtocol:@protocol(TheMethodsForTheMiddleManToHandle)];
fakeView.receiver = self.realView;
fakeView.middleMan = self;
[someViewController.view addSubview:fakeView];将您想要控制的方法放在TheMethodsForTheMiddleManToHandle中
@protocol TheMethodsForTheMiddleManToHandle
- (void)setFrame:(CGRect)frame;
@endhttps://stackoverflow.com/questions/24314468
复制相似问题