2012-11-18 58 views
1

我有一個@property在我的應用程序的模型類,將調用prepareForSegue:。它在我的CalculatorBrain課堂上公開宣佈。如何從prepareForSegue調用「自己」屬性?

@property (readonly) id program. 

吸氣看起來是這樣的:

- (id)program 
{ 
    return [self.programStack copy]; 
} 

如果你需要知道,programStackCalculatorBrain一個NSMutableArray @property存儲所有的操作和操作數的用戶輸入。

計算器的控制器是CalculatorViewController,我有一個大腦(CalculatorBrain)的私人財產。在我所有的CalculatorViewController方法中,我可以完美地調用self.brain.program。但是當我嘗試從我的prepareForSegue:方法中調用這個getters時,這將返回一個空數組。下面是我在CalculatorViewController可以完全調用self.brain.program的方法的例子:

- (IBAction)enterPressed 
{ 
    [self.brain pushOperand:[self.display.text doubleValue]]; 
    self.userIsInTheMiddleOfEnteringANumber = NO; 

    // update history label 
    NSArray *stack = self.brain.program; //This is to test self.brain.program 
    self.history.text = [CalculatorBrain descriptionOfProgram:self.brain.program]; 
} 

如果我們設置在self.history.text ...線斷點檢查數值,這裏是我們得到:

enter image description here

而且它是正確的,在塔那一刻程序有2個對象。

現在,這裏是我的prepareForSegue:方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"Graph"]) { 
     GraphingCalcViewController *newController = segue.destinationViewController; 
     // send program to newController 
     NSArray *stack = self.brain.program; //This is to test self.brain.program 
     newController.program = self.brain.program; 
    } 
} 

如果我們設置在newController.program ...行設置一個斷點,這裏就是我們得到:

enter image description here

兩個快照是從同樣的運行。所以我的問題是,當prepareForSegue:調用它時,爲什麼self.brain.program的值有所不同?也許這是一個非常愚蠢的錯誤,但我無法發現它。我會很感激這裏的一些幫助。我對iOS開發很新穎。

更新:問題似乎與programStack。在prepareForSegue:方法發揮作用之前,它在某種程度上是niling。所以當這個運行時,我們會得到新的空的programStack。其他一些方法(不是我的,據我所知)正在清除它。

任何人有任何想法可以清除我的財產在這裏?我有strong指向brain(CalculatorViewController中的CalculatorBrain *)和programStack(CalculatorBrain中的NSMutableArray *)。

+0

請在GraphingCalcViewController.h中發佈newController.program的公共聲明,並將id更改爲NSMutableArray。將它聲明爲ID沒有意義。 – Pochi

回答

0

程序的獲取程序使用programStack上的複製方法進行分配,並且要求programStack遵守NSCopying協議。 hs programStack真的只是NSMutableArray?因爲它服從NSCopying,應該工作。試着拿出副本?

更新:self.brain的值是否在您的兩個電話之間變化?

+2

他在做cs193p。這只是一個正常的NSMutableArray。我的圖形計算器工作正常。我在我創建的賦值計算器中的'prepareForSegue'工作正常,它幾乎完全相同。 :\ – Metabble

+0

因爲它是一個副本,所以如果在程序的主體中執行了[stack addObject:something],則會產生與[self.brain.program addObject:something]不同的結果。這是否發生在某個地方? – emrys57

+0

@Mababble是對的。我正在做cs193p,它只是一個普通的NSMutableArray。現在,emrys57,我不能向任何一個發送'addObject:'消息,因爲堆棧是一個簡單的NSArray測試,並且大腦的程序屬性是'只讀'的,它甚至沒有實例變量存儲一些東西。它的工作是返回一個NSMutableArray程序堆棧的副本。 代詞:所以你的GraphController通過與我一樣的prepareForSegue方法得到了一個正確的程序版本?這正在爬我出去:\ –

0

我的CS193代碼非常相似,我看到的主要區別是我傳遞了程序的副本而不是對同一對象的引用。所以試試這個:

newController.program = [self.brain.program copy]; 
+0

剛剛嘗試過它並沒有工作:(但是我確實發現了一些東西,我的'programStack'在某種程度上被清除了,我在上面的帖子的更新中添加了一些細節 –

+0

我會嘗試添加一條NSLog語句到你的程序屬性的setter,這樣你就可以看到它何時被調用。 – user1790252

相關問題