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

Stu*_*rtM 6 objective-c uiview ios ios6 ios7

我想找出如何UIView使用传入参数的自定义init方法正确子类化.

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__);

}
Run Code Online (Sandbox Code Playgroud)

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

spmInitWithWord:(NSString *)word difficulty:(GameTurnDifficulty)difficulty
Run Code Online (Sandbox Code Playgroud)

然后如何调用标准init方法.我是否会在最初创建视图时调用此自定义init?[[UICustomViewExample alloc] spmInitWithWord:testWord difficulty:turnDifficulty]??

Dun*_*n C 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
}
Run Code Online (Sandbox Code Playgroud)