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

时间:2014-02-24 13:25:25

标签: ios objective-c uiview ios6 ios7

我希望找到如何使用传入参数的自定义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] ...

2 个答案:

答案 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方法,无论您喜欢哪种方式,还是适用于您的用例。