Ios Objective-C中的自定义构造函数

Ios Objective-C中的自定义构造函数,ios,objective-c,Ios,Objective C,我已经创建了一个扩展UIView的自定义类。这个类有一些方法,比如DrawRect 到目前为止,我只是把它放在我的故事板上,告诉大家它属于这个班级。现在,我将动态地分配和放置这些对象。是否有一个方法可以调用: [[MyObj alloc] initWithFrame:....] 我很高兴能找到任何帮助 您可以在类的头文件中创建自己的构造函数。 返回值的类型为id,在主文件中的声明中,您需要调用一个超级初始化,例如self=[super initWithFrame:CGRect],然后返回se

我已经创建了一个扩展UIView的自定义类。这个类有一些方法,比如DrawRect

到目前为止,我只是把它放在我的故事板上,告诉大家它属于这个班级。现在,我将动态地分配和放置这些对象。是否有一个方法可以调用:

[[MyObj alloc] initWithFrame:....] 

我很高兴能找到任何帮助

您可以在类的头文件中创建自己的构造函数。 返回值的类型为id,在主文件中的声明中,您需要调用一个超级初始化,例如self=[super initWithFrame:CGRect],然后返回self。您可以在头文件中自定义构造函数的参数以满足您的需要

UIView的示例:

.h:

如果UIView的实例未从Interface Builder文档中归档,则不会调用它们的initWithFrame:方法。相反,unarchiver调用initWithCoder:。理想情况下,您应该重写这两个方法,并让它们调用提供初始化代码共享实现的公共方法。这样,无论视图是以编程方式实例化的,还是作为未归档的结果,都将正确初始化视图。下面是一个例子:

- (id)initWithFrame:(CGRect)frame
{
    if (!(self = [super initWithFrame:frame])) return nil;
    [self configureSubviews];
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (!(self = [super initWithCoder:aDecoder])) return nil;
    [self configureSubviews];
    return self;
}

- (void)configureSubviews
{
    // Custom configuration code...
}

它是UIView的一个子类?然后它继承initWithFrame:.1类名应以大写字母开头,只需说;-你真的试过吗?因为如果您是从UIView派生的,那么您确实有initWithFrame:。还是有什么问题?@DarkDust当然,它以大写字母开头;为了在示例中清晰起见,刚刚重命名了它。对不起,如果我不清楚的话,事实上我的错误是打电话给MyCalss myObj=[(MyC类……而不是MyClass * MyObj.…):为了更符合苹果的COA编码准则,考虑重新命名你的初始化器方法“iNITHythFrime:ButoButoCurror”。我个人认为,我为初学者编写的方法更容易理解,所以他们理解你可以传递不同的参数,而不仅仅是一个参数。。但请随意否决我的投票并编辑我的答案。虽然,是的,你在编码指南上是正确的,但我不想在这一点上冒犯你。如果新来者不了解Objective-C的基本原理,例如如何传递多个参数,他们似乎不太可能理解这个问题,更不用说你的答案了。但这是正确的一个小问题,当然不值得投反对票。我将让你决定是否编辑你的答案。好了,我认为有一个有意义的标题更容易阅读,但符合指导原则…;请返回instancetype而不是id:即使编译器自动转换以“alloc”、“init”开头的方法或“new”,并且返回类型id为return instancetype,它不会转换其他方法。Objective-C约定是为所有方法显式写入instancetype。+1这是在使用Interface Builder和手动初始化时,如果希望自定义视图正常工作时必须使用的模式。
#import "CustomView.h"

@implementation CustomView
-(id)initWithFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor{

self = [super initWithFrame:frame];

if (self) {

//after allocation you could set variables:

self.backgroundColor = backgroundColor;

}

return self;
}

@end
- (id)initWithFrame:(CGRect)frame
{
    if (!(self = [super initWithFrame:frame])) return nil;
    [self configureSubviews];
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (!(self = [super initWithCoder:aDecoder])) return nil;
    [self configureSubviews];
    return self;
}

- (void)configureSubviews
{
    // Custom configuration code...
}