2012-02-25 45 views
0

由於某種原因,屬性的自定義設置器永遠不會被調用。所以它在運行時總是通過零。視圖控制器中視圖初始化之前調用的方法 - iPhone iOS 5 SDK

我有一個視圖控制器,創建一個NSValue對象的NSArray並將其作爲屬性傳遞給視圖。但是,該屬性總是通過零,即使我使用調試器驗證視圖控制器中的NSArray是否正常。

視圖控制器 @interface GraphingViewController() @屬性(非原子,弱)IBOutlet中GraphingView * graphingView; @end

- (void) determinePointsOnGraph 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    NSMutableArray *pointsForGraph = [[NSMutableArray alloc] init]; 

    float startingPoint = -250; 
    for (int i = 0; i < 500; i++) { 
     float x = startingPoint; 
     startingPoint++; 

     [dict setValue:[NSNumber numberWithFloat:x] forKey:[NSString stringWithString:@"x"]]; 
     float y = [CalculatorBrain runProgram:[self graph] usingVariableValues:dict]; 

     [pointsForGraph addObject:[NSValue valueWithCGPoint:CGPointMake(x,y)]]; 
} 

//This calls the pointer to the view, and the setter for the view's property 
[self.graphingView setPointsOnGraph:pointsForGraph]; 
} 

查看

@synthesize pointsOnGraph = _pointsOnGraph; 
- (void)setPointsOnGraph:(NSArray *)pointsOnGraph 
{ 
    //Custom setter for property, never gets called if a break point is put here 
    _pointsOnGraph = pointsOnGraph; 
    [self setNeedsDisplay]; 
} 

- (void)drawLine:(NSArray *)pointsOfLine inContext:(CGContextRef)context 
{  
    CGPoint pointsOfLineAsCGPoints[[pointsOfLine count]]; 

    for (int i = 0; i < sizeof(pointsOfLineAsCGPoints); i++) { 
     pointsOfLineAsCGPoints[i] = [[pointsOfLine objectAtIndex:i] CGPointValue]; 
    } 

    CGContextAddLines(context, pointsOfLineAsCGPoints, sizeof(pointsOfLine)); 
    CGContextClosePath(context); 
    CGContextStrokePath(context); 
} 

的方法的drawLine由所謂的drawRect,並通過了pointsOnGraph財產pointsOfLine。即使我在drawRect中放置了一個斷點並查看了pointsOnGraph屬性,它在視圖中始終爲零。但是,當視圖控制器將其傳遞給視圖時,它將包含數百個對象。

我只是不明白爲什麼該屬性總是爲零,如果我在setter中放置一個斷點,它永遠不會被調用。

更新 我已經驗證faceView參考視圖爲零當它第一次調用,但IBOutlet中表現爲正常掛鉤,並認爲最終得到顯示。看來,self.graphingView IBOutlet中被初始化

以下是我從

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.identifier isEqualToString:@"Graphing"]) { 
     [segue.destinationViewController setGraph:[[self.brain program] mutableCopy]]; 
     [segue.destinationViewController determinePointsOnGraph]; 

    } 
} 

解決方案 調用determinePointsOnGraph方法Segue公司的視圖控制器前視圖控制器方法獲取調用在viewDidLoad委託中,而不是在準備segue。這確保視圖已經創建。我還有另一個問題,這是因爲在視圖控制器中訪問數據的視圖出口沒有在視圖設置器中初始化。

回答

0

呼叫確定視圖的委託方法上圖點之前的viewDidLoad

+0

非常感謝,花了一點時間才得以實現,但問題是我不理解代表。感謝您的幫助,並指引我朝着正確的方向前進。 – KopfaufAchseln 2012-02-25 04:55:34

0

確保self.graphingView不是nil調用二傳手

+0

self.graphingView是零,但我指向一個插座,所以我不知道我應該如何創建視圖? – KopfaufAchseln 2012-02-25 01:02:53

+0

如果視圖是可見的,請確保您IBOutlet連接正確 – JiaYow 2012-02-25 01:04:11

+0

我從另一個視圖控制器切換到graphingViewController,似乎在IBOutlet初始化視圖之前調用視圖控制器方法? – KopfaufAchseln 2012-02-25 01:10:27

0

好像您要發送的消息- (空)setPointsOnGraph :(NSArray *)pointsOnGraph在self.graphingView被初始化之前太早。

我建議你發送消息- 在GraphingViewController的viewWillAppear中(無效)determinePointsOnGraph。這是因爲你的self.graphingView應該在你設置NSArray pointsOnGraph之前被初始化(這應該在調用-viewDidLoad的時候完成)。

爲了確認我的建議可行,請添加您的GraphingViewController實現,特別是調用消息- (void)determinePointsOnGraph的部分。

爲了供您參考,當我對視圖和方法的順序感到困惑時,我在viewDidAppear,viewDidLoad,drawRect和viewWillAppear中輸入了NSLogs以闡明發生了什麼。順序應該是viewDidLoad - > viewWillAppear - > drawRect - > viewDidAppear

另一方面,如果您的代碼正常工作,則graphingView中的setter方法將泄漏內存。在將其設置爲給定指針之前,您需要釋放_pointsOnGraph。例如,可以按如下方式實現:

- (void)setPointsOnGraph:(NSArray *)pointsOnGraph 
{ 
    [_pointsOnGraph release]; 
    _pointsOnGraph = pointsOnGraph; 
    [self setNeedsDisplay]; 
} 

加,你應該自動釋放了NSArray的你發送消息之前,例如:

[self.graphingView setPointsOnGraph:[pointsForGraph autorelease]]; 

,但更重要的是,你可以減少通過不分配初始化NSMutableArray的代碼量和括號。這可以通過改變

NSMutableArray *pointsForGraph = [[NSMutableArray alloc] init]; 

需做

NSMutableArray *pointsForGraph = [NSMutableArray dictionary]; 

而忽略了自動釋放。

+0

謝謝,你是對的我在視圖初始化之前調用了方法。我改變了它,以便視圖使用一個插座來調用視圖控制器,這似乎將所有東西都分類出來。 – KopfaufAchseln 2012-02-25 22:23:58

+0

關於內存管理的注意事項也很有用,非常感謝。 – KopfaufAchseln 2012-02-25 22:24:35

相關問題