2014-02-24 59 views
6

我期待了解如何正确地继承UIView使用自定义init方法传入的参数。创建自定义的UIView init方法与参数

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

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

文档说以下

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吗?​​??

回答

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 
} 
+0

谢谢@Duncan C--其实在这种情况下,对于IB来说视图太高级了,至少我认为它会是。我动态地创建基于传递来创建此自定义视图的单词的子视图(平铺图),因此视图通常非常不同。在你的回答中,你会谈到创建自定义'doInitSetup',然后从'initWithFrame'等方法调用该方法。我的问题是我需要一个完全自定义的init(最后一个问题),比如'initWithWord'。如果我实现了这个方法,我应该像下面的其他答案一样,调用标准的自启动方法。如果有助于解释,请使用代码示例? – StuartM

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方法,无论您喜欢还是适合您的用例。