2012-04-21 50 views
1

在視圖控制器的接口,我有在iOS上,爲什麼ViewController中的init不起作用?

@property int count; 

,並在實施中,我有

@synthesize count; 

-(id) init { 
    self = [super init]; 
    if (self) { 
     self.count = 100; 
    } 
    return self; 
} 

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"%i", self.count++); 
} 

但由於某些原因,在第一時間self.count得到了印,它是0,但不是100?

+0

視圖控制器如何被創建? – ACBurk 2012-04-21 04:01:29

+0

它是一個標準的單一視圖應用程序 – 2012-04-21 04:04:42

回答

2

其中一個-init方法將在您的UIViewController上調用,具體取決於它是從.xib,storyboard還是在代碼中的其他位置手工分配的。

一個更好的地方,把這種初始化是在-viewDidLoad,像這樣

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.count = 100; 
} 
+0

所以這不是一種模式,我們把所有的init代碼放在我們自己的'init'方法中吧? – 2012-04-21 04:03:56

+1

我經常發現它使用-viewDidLoad更清潔,因爲那樣你就不必擔心ViewController是如何初始化的。否則,你必須覆蓋-initWithCoder,-intiWithNibName:bundle,並且只是簡單的-init(可能是其他的) – 2012-04-21 04:05:59

1

把一個NSLog的或調試斷點在你的init方法,我懷疑你會發現它不叫。如果你看看UIViewController,你會看到其他的初始化方法(例如,如果你使用的是NIB,它會調用initWithNibName:bundle:)。如果是通過故事板,它可能會有所不同。請參閱Apple的View Controller Programming Guide for iOS中有關初始化的討論。

一般視圖控制器配置的更好的地方是viewDidLoad

+0

你是否確定'initWithNibName'?我添加了該方法,並沒有初始化count ...但我沒有爲方法定義任何參數 – 2012-04-21 14:41:45

+0

我的觀點是有一大堆init方法。除非您自己調用它(例如,此視圖控制器是您的其他視圖之一初始化,分配和打開的視圖控制器),否則最好不要嘗試猜測正在使用哪一個視圖。你在'viewDidLoad'中做了什麼初始化,而不是任何特定的init方法。 – Rob 2012-04-22 00:00:58

0

更改爲:

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

實際上得到由XIB,這就是「解碼」,或取消裝箱它創建的視圖。當發生這種情況時,XIB調用initWithCoder:

+0

你可以仔細檢查...我試圖將它設置爲10000,並刪除了viewDidLoad中的一個,但它沒有設置爲10000 – 2012-04-21 07:58:07

相關問題