【问题标题】:Adding property to super class UIView将属性添加到超类 UIView
【发布时间】:2013-05-22 10:50:03
【问题描述】:

我正在尝试将我的所有观点提供一个名为newProperty 的新属性。 由于所有视图都会有它,因此将它添加到超类中会更有意义。 在这种情况下,我想将newProperty 添加到UIView,以便所有UIView 子类(UIWindowUIPickerViewUITabBar 等)都将继承它。 那么有可能吗?

【问题讨论】:

    标签: objective-c oop inheritance


    【解决方案1】:

    当您的属性需要支持实例变量时,您可以使用关联对象:

    How do I use objc_setAssociatedObject/objc_getAssociatedObject inside an object?

    What is objc_setAssociatedObject() and in what cases should it be used?

    http://darkdust.net/writings/objective-c/attaching-objects

    ...但您可能需要在使用之前考虑清楚。

    当您的属性不需要实例变量时,请参阅 Luke 的回答。

    【讨论】:

      【解决方案2】:

      在 UIView 上写一个类别。

      在 Xcode 中,转到 File -> New -> File,然后从 iOS 部分的 Cocoa Touch 行中选择“Objective-C Category”。确保类别在 UIView 上,给它一个名称,然后你就离开了。

      从这里,您可以添加属性甚至实例方法,假设您在应用的前缀文件中导入类别,所有从 UIView 继承的类都可以访问。

      编辑:我没有使用关联的对象。这是一个非常简单的示例,它使用对象中已经存在的预定义属性,使用我自己的属性来简化它们的检索。

      OP 没有说明他们希望向 UIView 添加什么样的属性,这就是为什么我假设一个类别就足够了。我敢肯定你对下面的 cmets 都是正确的:真正自定义属性上的数据存储。

      实际上,关于他们的“newProperty”的使用,OP 的目标还没有那么清楚,但我不赞成投反对票。

      例如:UIView 上的类别称为位置。 (UIView+位置)

      UIView+Position.h
      
      @interface UIView (Position)
      
      -(CGFloat)left;
      -(CGFloat)right;
      -(CGFloat)top;
      -(CGFloat)bottom;
      
      @property (nonatomic) CGFloat left;
      @property (nonatomic) CGFloat right;
      @property (nonatomic) CGFloat top;
      @property (nonatomic) CGFloat bottom;
      
      @end
      
      
      
      UIView+Position.m
      
      #import "UIView+Position.h"
      
      @implementation UIView (Position)
      
      -(CGFloat)left
      {
          return self.frame.origin.x;
      }
      
      -(CGFloat)right
      {
          return self.frame.origin.x + self.frame.size.width;
      }
      
      -(CGFloat)top
      {
          return self.frame.origin.y;
      }
      
      -(CGFloat)bottom
      {
          return self.frame.origin.y + self.frame.size.height;
      }
      
      @end
      

      【讨论】:

      • 一个类别可以为类添加方法,但不能添加属性。这是因为一个类别不能为 getter 和 setter 添加后备存储 / ivar 来操作。
      • 这将允许您声明和定义实例方法(包括属性声明),但它不允许存储(例如,在类别的实现中合成属性是错误的)。跨度>
      • @Luke: 显示soime代码好友?您是否使用了关联引用?
      • 您可以添加充当访问器的方法。但是您仍然需要找到存储数据的地方。并确保在释放对象时清除数据。
      猜你喜欢
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2014-08-23
      • 2015-07-06
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多