2011-11-13 35 views
6

我是iOS5和故事板新手。iOS5:與loadview和init和實例變量混淆

我注意到,如果我在我的viewcontroller .h文件中聲明一個實例變量,並在我的viewcontroller的.m文件的init中設置值,當viewcontroller的視圖顯示時,我的實例變量在viewDidLoad 。爲了讓我獲得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. 爲什麼不是我的變量可以在viewDidLoad中,當我宣佈,在我的.h和.m文件執行?
  2. 如果是這樣的話,viewDidLoad或viewWillAppear是加載視圖控制器數據的公共位置嗎?
  3. 它看起來像即使你實例化一個viewcontroller並調用init函數,viewDidLoad也不一定要顯示變量。
  4. 哪裏是我的視圖控制器加載模型(數據)的正確位置/方法?

在此先感謝

回答

14

所以要回答你的第一個問題,這就是所謂在這種情況下,初始值設定的initWithCoder :,不初始化。因此,如果您將您的NSArray初始化移至initWithCoder:您應該發現它在視圖加載之前可用。

不要忘記你也必須調用你的超類的初始化器。所以像這樣的格局將工作:

-(id)initWithCoder:(NSCoder *)aDecoder { 

    if ((self = [super initWithCoder:aDecoder])) { 

     // initialize what you need here 
    } 

    return self; 

} 

您也將獲得awakeFromNib的initWithCoder叫:畢竟你的店鋪已經連接,所以如果你的初始化依賴於出口被填充,則有有機會在那裏進行初始化。

然後,當然你有viewDidLoad中viewWillAppear中:。我不知道使用「正確」方法的一般答案(問題2和問題4)。這取決於您擁有多少數據,需要刷新的頻率以及加載需要多長時間。我的意見是,這是每個案件的決定。

對於問題3,你有沒有你在那裏見過的例子?初始化器肯定會在viewDidLoad之前調用。訣竅是知道正在調用哪個初始化程序。

請記住,viewDidLoad可能會在您的視圖控制器的生命週期中被多次調用。所以要爲此做好準備。當然,viewWillAppear:更有可能在視圖控制器的整個生命週期內被多次調用。

希望有所幫助。

+0

HI Firoze, 感謝您的回答。 initWithCoder絕對是正確的函數調用, 所有的viewcontroller總是調用initWithCoder。將我的變量實例化放在initWithCoder,initWithNibName和init中有什麼區別?這是否意味着當我做SomeViewController *測試= [[SomeViewController分配]初始化],initWithCoder也被稱爲? – sonoluminescence

+0

'awakeFromNib'是這樣的IMO初始化的更好的地方。要回答這個問題 - 如果你從nib文件創建一個對象 - 使用awakeFromNib,如果你在代碼中創建一個對象 - 使用init。 – Abizern

+0

恩,不,@sunwukong,我不是建議你自己調用initWithCoder。當它取消存檔故事板中的任何視圖控制器時,該框架將調用該方法。因此,如果您想要在故事板中初始化視圖控制器,則需要覆蓋initWithCoder:和/或awakeFromNib。 –