UIView:如何在调用initWithFrame之前设置属性?

时间:2015-02-18 14:26:14

标签: ios objective-c uiview initialization

我有一些MyView作为UIView的子类,有以下方法:

@interface MyView : UIView

@property (nonatomic, strong) UIImage *image;

@end

@implementation

- (id)initWithImage:(UIImage *)image {
    self = [self init];
    self.image = image;

    return self;
}


- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        //here I want to access my image property
    }
}

@end

在这个类中,我初始化对象:

[[MyView alloc] initWithImage: someimage];

initWithFrame:是必需的,initWithImage:是可选的

2 个答案:

答案 0 :(得分:1)

在调用初始化程序之前,无法在对象上设置属性,因为在调用该对象之前,该对象不存在。如果初始化者需要访问属性,则需要将其作为参数提供(因为它是要求,用于成功创建对象)。

- (id)initWithFrame:(CGRect)frame

采用CGRect参数,因为此方法的目的是创建具有预定义帧的实例;它为默认的NSObject的{​​{1}}添加了功能,因此随- (instancetype) init参数一起提供。

frame需要一个框架,因此它可以在屏幕上展开并呈现(除其他外)。在实现的某个时刻,它将执行对默认UIView方法的调用,然后访问[super init]以使用它已经传递的帧。它在现有类上构建

您正在self上构建,因为您希望能够使用UIView对其进行初始化。您可以选择为子类提供默认框架:

UIImage

或提供更“有用”的默认值(例如UIImageView会这样做)并将图片尺寸作为默认框架:

  

初始化UIImageView对象

     

- (instancetype)initWithImage:(UIImage *)image { if (self = [super initWithFrame:CGRectMake(0,0,0,0)]) { self.image = image; } }

     

<强>讨论   此方法调整接收器的帧以匹配指定图像的大小。默认情况下,它还会禁用图像视图的用户交互。

使用初始化程序:

- (instancetype)initWithImage:(UIImage *)image

答案 1 :(得分:0)

如果您启动了&#34; MyView&#34;使用initWithImage,我怀疑它应该调用initWithFrame。我建议你使用

   - (id)initWithFrame:(CGRect)frame :(UIImage *)image

或更好

   - (id)initWithFrame:(CGRect)frame image:(UIImage *)image. 

所以你可以在同一个方法调用中传递图像。确保添加

   - (id)initWithFrame:(CGRect)frame image:(UIImage *)image; 

也在您的.h文件中。