Objective c 更改私有实现中的属性类类型

Objective c 更改私有实现中的属性类类型,objective-c,Objective C,我在iOS上有一个类,它有一个其他对象可以读取的UIView属性。为了这个类的内部实现,我希望这个视图是UIView的一个自定义子类,但是这个类的客户机不需要知道这一点。对他们来说,此属性应该也将像任何其他UIView一样运行 理想情况下,我想要的是这样的东西 MyViewController.h: @property (nonatomic, readonly) UIView *aView; MyViewController.m: @property (nonatomic, readwrite

我在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;

有更好的方法吗?

我更喜欢的方法是给私有财产起一个不同的名字。然后实现公共属性的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

因为您使用的是视图控制器,所以您可以这样做

第一步。

例如,添加私有属性

@property(nonatomic, readonly) CustomView *customView;
并重写getter以返回视图

-(CustomView *)customView{ return (id)self.view; }
通过这种方式,您可以使用该属性调用特定于类的方法,而无需每次强制转换该属性,并且任何其他对象都可以与视图控制器的视图进行交互,就像它们与任何其他视图控制器进行交互一样

步骤2


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

  • 您正在从故事板实例化vc
  • 在这种情况下,可以在Interface Builder中选择视图并将其设置为自定义类。完成了

  • 您正在从代码实例化VC
  • 在这种情况下,您必须覆盖视图控制器的
    loadView
    方法,并在其中创建视图:

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

    当然我现在真的记得很久以前做过这件事……真不敢相信我竟然没有想到。