2013-03-12 98 views
2

我正在开发一个iOS应用程序与最新的SDK。自定义初始化自定义UIView不起作用

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

我要调用一个名为setUpVars:方法,但我不知道从哪里发送消息给该方法:

- (id)initWithFrame:(CGRect)frame; 
- (id)initWithCoder:(NSCoder*)aDecoder; 

这个类可以用自定义的厦门国际银行中,或者加入到故事板,所以我需要确保在每种情况下都会调用该方法。

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

在哪里我要补充[self setUpVars];

+0

可以显示setUpVars方法? – pdrcabrod 2013-03-12 09:15:30

+0

@pdrcabrod问题已更新。 – VansFannel 2013-03-12 09:16:24

回答

0

我觉得你需要从每个方法发送这个消息,也不要忘记awakeFromNib方法。

您可以创建BOOL变量,如isAlreadySetup,并将其设置为YES,setUpVars方法。

+0

@VansFannel,如果回答解决你的问题你能接受吗? – zakhej 2013-03-27 08:27:00

-1

我倾向于认为你应该打电话从这个方法 - (无效)viewDidLoad中负责控制的方法

+0

viewDidLoad是视图控制器方法..不是视图的!!! – 2013-03-12 09:26:16

+0

viewDidLoad是在子视图上执行工作的正确位置,因为您知道,何时调用由界面构建器定义的所有视图都没有正确加载。此外,可变管理将在不是视图的控制器上完成。 – 2013-03-12 09:40:10

+0

这些变量正确或错误地是视图的内部状态而不是viewControllers,viewController为视图的状态设置默认值并且会导致非常脆弱的设计没有意义 – 2013-03-12 09:51:12

0

如果您使用Interface Builder来设计自己的界面,initWithFrame:当您的视图对象不叫随后从nib文件加载。而是调用initWithCoder。所以如果你喜欢通用的方式,你可以在两种方法中初始化你的变量。工作在两种情况下

0

文档说

awakeFromNib

准备服务接收器已经从 Interface Builder的存档或笔尖文件加载后。

- (void)awakeFromNib 
{ 
[self setUpVars]; 
} 
2

基本上你会希望涵盖这两种情况下

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

只是不要忘记'init:'。墨菲说,它可以被称为,因此它会被称为。 – 2013-03-12 10:30:20

+0

@HermannKlecker as'initWithFrame:'是指定的初始化工具'init'通常会被覆盖以调用它,这是一个快速测试。 – 2013-03-12 10:38:20