我有一些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:
是可选的
答案 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文件中。