我希望找到如何使用传入参数的自定义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]
...
答案 0 :(得分:5)
不,我建议采用不同的方法。编写init方法来调用super initWithFrame。这是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
}
答案 1 :(得分:0)
假设您的自定义方法如下
-(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方法,无论您喜欢哪种方式,还是适用于您的用例。