正在使用参数创建自定义UIView init方法



我想知道如何使用传入参数的自定义init方法正确地对UIView进行子类化。

我已经在这里阅读了UIView类参考文档:https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html

目前,UIView正在UIViewController中创建,可以移动/重构到自己的子类中。此外,目前视图完全是在代码中创建的,框架是通过添加到视图本身的约束来计算的。

文件显示以下

initWithFrame:-建议您实现此方法。除了此方法之外,您还可以实现自定义初始化方法,或者代替此方法。

问题
由于我没有创建一个框架作为视图的起点/也没有从XIB加载它,因此将其子类化的正确过程是什么?

这是正确的吗:

-(id)init {
NSLog(@"%s",__PRETTY_FUNCTION__);
self = [super init];
if (self) {
// Init code
[self spmCustomInit];
}
return self;
}
-(void)spmCustomInit {
NSLog(@"%s",__PRETTY_FUNCTION__);
}

如果这是正确的,我需要进一步改变。创建视图时,它会根据信息创建一些子视图。此外,布局根据难度级别而不同。进一步的问题
如何创建进一步的自定义init方法,并传入参数
例如,如果我创建了一个名为的方法

spmInitWithWord:(NSString *)word difficulty:(GameTurnDifficulty)difficulty

然后如何调用标准的init方法。在最初创建视图时,我会调用这个自定义init吗?[[UICustomViewExample alloc] spmInitWithWord:testWord difficulty:turnDifficulty]??

不,我建议采用不同的方法。编写init方法来调用superinitWithFrame。这是UIView的指定初始值设定项。通过自己调用它,可以确保调用任何需要进行的操作系统设置。

如果需要,可以传入CGRectZero作为帧,然后稍后设置帧。

请注意,您还应该计划使用initWithCoder支持初始化。如果您将视图放入XIB文件或Storyboard中,就会调用该方法。

我所做的是创建一个方法doInitSetup,并在那里进行自定义初始化。然后,我从initWithFrame和initWithCoder中调用该方法。

在您的情况下,您可以为自定义设置添加属性,如果您将其中一个视图放在XIB/Storyboard中,则可以使用用户运行时属性来设置这些属性。

使用IB来设计表单是个好主意。我建议你学会使用它们。它们让点赞变得更容易,让你可以访问几乎不可能从代码中使用的功能。

您的代码可能如下所示:

- (id) initWithWord: (NSString *) theWord
{
self = [super initWithFrame: CGRectZero];
if (!self)
return nil;
[self doInitSetupWithWord: theWord];
return self;
}
- (void) doInitSetupWithWord: (NSString *) theWord
{
//Do whatever you need to do to set up your view.
}

- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder: aDecoder];
if (!self) {
return nil;
}
[self doInitSetupWithWord: nil];
return self;
}
- (void) setWord: (NSString *) theWord
{
_theWord = theWord;
//If possible, set things up for the new word
}

假设您的自定义方法如下

-(instancetype) initWithFrame:(CGRect)frame base:(UIColor *)base textColor:(UIColor *)textColor
{
if(self = [super initWithFrame:frame])
{
self.backgroundColor = base;
self.label.textColor = textColor;
}
return self;
}

if条件创建UIView对象,您可以根据参数对其进行进一步自定义。您可以使用initWithFrame:或init方法,无论您喜欢或适用于您的用例。

最新更新