我是iOS5和故事板的新手。
我注意到如果我在viewcontroller .h文件中声明一个实例变量并在我的viewcontroller的.m文件的init中设置值,当显示viewcontroller的视图时,我的实例变量在viewDidLoad中显示null。为了让我获得myvariables,我需要在viewDidLoad中进行[self init]。我的问题是:
@interface tableViewController : UITableViewController
{
NSMutableArray *myvariable;
}
@end
@implementation tableViewController
-(id)init
{
myvariable = [[NSMutableArray alloc]initWithObjects:@"Hi2",@"Yo2",@"whatsup2", nil];
}
- (void)viewDidLoad
{
NSLog(@"%@",myvariable); // DISPLAYS NULL
[super viewDidLoad];
}
提前致谢
答案 0 :(得分:14)
所以为了回答你的第一个问题,在这种情况下调用的初始化程序是initWithCoder :,而不是init。因此,如果您将NSArray初始化移动到initWithCoder:您应该发现它在视图加载之前可用。
不要忘记你也必须调用你的超类'初始化程序。所以像这样的模式会起作用:
-(id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
// initialize what you need here
}
return self;
}
你也会在 initWithCoder:之后调用 awakeFromNib ,并且在你的所有插座都已连接之后,所以如果你的初始化取决于正在填充的插座,那么就是在那里进行初始化的机会。
当然,你有 viewDidLoad 和 viewWillAppear:。我不知道使用“正确”方法有一般性答案(问题2和4)。这取决于您拥有多少数据,需要刷新的频率以及加载所需的时间。我的意见是,这是每个案件的决定。
对于问题#3,你有一个你在那里看到的例子吗?初始化程序肯定会在viewDidLoad之前调用。诀窍是知道正在调用哪个初始化程序。
请注意,在视图控制器的生命周期内,可能会多次调用 viewDidLoad 。所以要做好准备。当然, viewWillAppear:更有可能在视图控制器的生命周期内被多次调用。
希望有所帮助。