Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 带有自定义初始化的自定义UIView不';行不通_Ios_Objective C_Uiview - Fatal编程技术网

Ios 带有自定义初始化的自定义UIView不';行不通

Ios 带有自定义初始化的自定义UIView不';行不通,ios,objective-c,uiview,Ios,Objective C,Uiview,我正在用最新的SDK开发一个iOS应用程序 我创建了一个继承自UIView的类,每次实例化该类时,我都必须进行一些初始化 我必须调用名为setUpVars:的方法,但我不知道向该方法发送消息的位置: - (id)initWithFrame:(CGRect)frame; - (id)initWithCoder:(NSCoder*)aDecoder; 这个类可以与自定义xib一起使用,也可以添加到故事板中,所以我需要确保在任何情况下都会调用该方法 - (void)setUpVars { _

我正在用最新的SDK开发一个iOS应用程序

我创建了一个继承自
UIView
的类,每次实例化该类时,我都必须进行一些初始化

我必须调用名为
setUpVars:
的方法,但我不知道向该方法发送消息的位置:

- (id)initWithFrame:(CGRect)frame;
- (id)initWithCoder:(NSCoder*)aDecoder;
这个类可以与自定义xib一起使用,也可以添加到故事板中,所以我需要确保在任何情况下都会调用该方法

- (void)setUpVars
{
    _preferenceKey = @"";
    _preferenceStatus = NO;
    _isDown = NO;
}

我必须在哪里添加
[self-setUpVars]

我认为您需要从每个方法发送此消息,也不要忘记
awakeFromNib
方法


您可以创建
BOOL
变量,类似于
isAlreadySetup
并在
setUpVars
方法中将其设置为
YES

如果您使用Interface Builder设计界面,我倾向于认为您应该从负责的控制器的-(void)viewDidLoad方法调用此方法,
initWithFrame
:在随后从nib文件加载视图对象时不调用。而是调用
initWithCoder
。因此,如果您喜欢通用方法,您可以用这两种方法初始化变量。在这两种情况下都有效

awakeFromNib

在从服务器加载接收器后,为其准备服务 接口生成器存档或nib文件


基本上,您将希望涵盖这两种情况

- (id)initWithFrame:(CGRect)frame;
{
  self = [super initWithFrame:frame];
  if (self) {
    [self setUpVars];
  }
  return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder;
{
  self = [super initWithCoder:aDecoder];
  if (self) {
    [self setUpVars];
  }
  return self;
}

能否显示setUpVars方法?@pdrcabrod Question updated.viewDidLoad是处理子视图的正确位置,因为您知道调用它时,interface builder定义的所有视图都已正确加载。此外,变量管理是在控制器上而不是在视图上进行的。这些变量正确或错误地是视图的内部状态,而不是视图控制器,viewController为视图的状态设置默认值是没有意义的,这将导致非常脆弱的设计初始化应该在对象本身的init方法中完成。UIView子类不应该依赖外部类(包括所有者)来正确初始化它
viewDidLoad
是设置与初始化默认值不同的任何属性(如果它们是属性)的理想场所。只是不要忘记
init:
。墨菲说它可以被调用,因此它将被调用。@HermannKlecker as
initWithFrame:
是指定的初始值设定项
init
通常会被覆盖以调用它,这是一个快速测试显示的。
- (id)initWithFrame:(CGRect)frame;
{
  self = [super initWithFrame:frame];
  if (self) {
    [self setUpVars];
  }
  return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder;
{
  self = [super initWithCoder:aDecoder];
  if (self) {
    [self setUpVars];
  }
  return self;
}