• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 08:12:27 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

UIView的子类

我有一个 UIView 的子类 MyView

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

我想做什么

每当有消息发送到 MyView 时,我都想将其“转发”到 self.realView,除了少数消息。

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

- (void)setBackgroundColorUIColor *)color
{
     [self.realView setBackgroundColor:color] ;
}

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

异常(exception)情况

对于某些方法,我希望有一个明确的控制。例如:

- (void)setFrameCGRect)frame
{
    /* do stuff */
    
    [super setFrame:frame] ;
}



Best Answer-推荐答案


Instead of overriding explicitly all the methods, can I do it automatically, at the runtime?

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

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

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

更新: @robmayoff 指出 -forwardingTargetForSelector:,我没有想到,但在您的情况下可能是更好的解决方案。但是,它仍然无法处理需要重定向从父类(super class)继承的方法的情况。

关于ios - Objective-C:将大多数消息转发到另一个对象(在运行时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24314468/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap