【问题标题】:How to call a function that was replaced by my class Category,in the implementation of my category? [duplicate]如何在我的类别的实现中调用被我的类别类别替换的函数? [复制]
【发布时间】:2013-12-17 03:22:34
【问题描述】:

查看代码:

@implementation UIView (ios7)
- (void)layoutSubviews
{
    [self layoutSubviews];
    // ......
}

显然,这将导致“无限递归”。 超级也没有帮助。 我只是想在一个公共类的一个公共函数中添加一些代码,不认为继承会有帮助。 那么,他们有什么方法可以做到这一点。或者我的要求只是愚蠢的。 谢谢!

++++++++++++++++++++++++++++

@interface CPUIView :UIView
- (void)layoutSubviews;
@end
...


@implementation CPUIView
- (void)layoutSubviews
{
    [super layoutSubviews];
    // add some code
}
@end


@implementation UIView (CP)

+ (Class)class
{
    return NSClassFromString(@"CPUIView");
}

我认为这段代码将帮助我解决我的问题,我只想重写 UIView 的 layoutSubviews 函数。因此,我项目中的任何 UIView 类都会执行我想要在此函数中执行的操作。

【问题讨论】:

  • 简短回答:无法调用原始方法,您不应覆盖类别中的现有方法。
  • 它是possible,但不要这样做。

标签: ios objective-c


【解决方案1】:

就像@eswick 所说,类别用于向对象添加方法。通过声明与现有方法同名的方法,您实际上是在覆盖旧方法。因此,您不能调用它,因为您已经替换了它。这就是为什么如果要保留该方法的功能就需要子类化的原因。

【讨论】:

    【解决方案2】:

    类别旨在向类添加方法,而不是替换它们。这就是子类的用途。你最好创建一个子类,然后你可以调用它......

    [super layoutSubviews];
    

    ...如果需要调用原来的 UIView 方法。

    例如:

    @interface ESExampleView : UIView
    
    @end
    
    @implementation ESExampleView
    
    - (void)layoutSubviews{
        NSLog(@"layoutSubviews called!"); //Do whatever
        [super layoutSubviews];
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多