在私有实现中更改属性类类型

时间:2016-01-12 06:30:41

标签: objective-c

我在iOS上有一个类,它具有其他对象能够读取的UIView属性。为了我这个类的内部实现,我希望这个视图是UIView的自定义子类,但是这个类的客户端不需要知道它。对于他们来说,这个属性应该和任何其他UIView一样。

理想情况下我想要的是这样的。

MyViewController.h:

@property (nonatomic, readonly) UIView *aView;

MyViewController.m:

@property (nonatomic, readwrite) CustomView *aView;

编译器允许我这样做,但它实际上并不了解我想要做什么。它不允许将.aView作为CustomView对象发送消息,它只是让我将其作为常规UIView对象发送。

我目前的解决方法是做到这一点。

CustomView *newView = [[CustomView alloc] initWithFrame:CGRectZero];
[newView customViewMessage];
self.aView = newView;

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我首选的方法是为私有财产提供不同的名称。然后,我为公共属性实现getter并返回内部属性的实例变量。

示例:

<强> Class.h

@interface Class : NSObject

@property (nonatomic, readonly) UIView *aView

@end

<强> Class.m

@interface Class ()

@property (nonatomic, retain) CustomView *cView;

@end

@implementation

- (UIView *)aView {
    return _cView;
}

@end

答案 1 :(得分:1)

由于您使用的是视图控制器,因此您就是这样做的。

第一步。

添加私有属性,例如

@property(nonatomic, readonly) CustomView *customView;

覆盖getter以返回视图。

-(CustomView *)customView{ return (id)self.view; }

通过这种方式,您可以使用该属性调用特定于您的类的方法,而无需每次都进行强制转换,并且任何其他对象都可以像对待任何其他视图控制器一样与视图控制器的视图进行交互。

第2步

由于您使用的是视图控制器,因此有两个选项:

  1. 您正在从故事板中实例化vc <​​/ li>

    在这种情况下,您可以在Interface Builder中选择视图并将其设置为自定义类。完成。

    1. 您正在从代码
    2. 实例化VC

      在这种情况下,您必须覆盖视图控制器的loadView方法并在其中创建视图:

      -(void)loadView{ self.view = [CustomView new]; }