iOS5:与loadview以及init和实例变量混淆

时间:2011-11-13 01:47:53

标签: iphone xcode ios5 storyboard

我是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];
}
  1. 当我在.h和.m文件中声明并实现时,为什么我的变量在viewdidLoad中不可用?
  2. 如果是这种情况,viewDidLoad或viewWillAppear是为viewcontroller加载数据的常见位置吗?
  3. 即使你实例化一个viewcontroller并且调用了init函数,viewDidLoad也不一定要显示变量。
  4. 哪里是为我的viewcontroller加载模型(数据)的正确位置/方法?
  5. 提前致谢

1 个答案:

答案 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:更有可能在视图控制器的生命周期内被多次调用。

希望有所帮助。