2014-06-19 84 views
0

所以我有一個基於視圖的NSTableView連接到一個數組。表視圖最初有2個項目,但是當我嘗試使用IBAction添加對象時,在表視圖請求該行的視圖時,該對象以某種方式在tableView:viewForTableColumn:row:的最後一次迭代過程中消失。下面的代碼:對象消失在NSMutableArray用於基於視圖的NSTableView

-(IBAction)addTask:(id)sender 
{ 
    NSString *task = @"New"; 

    [todaysTasks addObject:task]; 
    [tableView reloadData]; 
} 

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView 
{ 
    return todaysTasks.count; 
} 

-(NSView *)tableView:(NSTableView *)tv viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    NSTableCellView *cellView = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
    NSLog (@"%@", todaysTasks); 
    TDTodaysTask *task = [todaysTasks objectAtIndex:row]; 
    [cellView.textField setStringValue:task.taskName]; 

    return cellView; 
} 

產生與

2014-06-19 16:59:35.211 Today[4513:303] (
    Test, 
    Test, 
    New 
) 
2014-06-19 16:59:35.212 Today[4513:303] (
    Test, 
    Test, 
    New 
) 
2014-06-19 16:59:35.214 Today[4513:303] (
    Test, 
    Test //"New" somehow disappears for no reason 
) 
2014-06-19 16:59:35.215 Today[4513:303] *** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1] 

日誌,當我使用addTask:這是沒有意義的我,因爲我沒有使用removeObjectAtIndex:都在我的項目。如果我嘗試在addTask:中添加2個對象,則前2個NSLog生成正確的輸出,但最後一個仍然只輸出2個結果。更詳細的內存地址分析顯示,最後一個日誌的內存地址比以前的日誌要多得多,如下所示。

2014-06-19 17:07:11.205 Today[4590:303] 0x60800024b5b0 
2014-06-19 17:07:11.205 Today[4590:303] 0x60800024b5b0 
2014-06-19 17:07:11.207 Today[4590:303] 0x60800024a260 //Address changes but I have not changed the array at all 

我絕對不知道爲什麼會這樣,所以如果任何人有任何想法,爲什麼這種情況正在發生,將是巨大的。

+0

顯示'numberOfRowsInTableView:'的實現。 – trojanfoe

+0

我懷疑問題是使用常量'NSString * task = @「New」;'。試試:'NSString * task = [NSString stringWithFormat:@「%@」,@「New」];'告訴我是否有區別。 – trojanfoe

+0

@trojanfoe將它添加到上面的代碼中。奇怪的是,它顯示在我添加對象後數組中有3個項目,但是當它詢問表格視圖中的最後一個項目時NSLog告訴我只有2個項目 – TheAmateurProgrammer

回答

0

錯誤可能在您正在創建新的nsmutablearray(不同的內存地址發現它)的那個控制器的代碼中。

或者你可能以某種方式創建一個新的控制器,這就是爲什麼內存地址改變了?

+0

[「調用makeViewWithIdentifier:owner:使awakeFromNib在您的應用程序中被多次調用,這是因爲makeViewWithIdentifier:owner:用傳入的所有者加載NIB,並且所有者也收到一個awakeFromNib調用,即使它已經醒了。「](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/PopulatingView-TablesProgrammatically/PopulatingView-TablesProgrammatically.html) – TheAmateurProgrammer

+0

大聲笑讓這是一個教訓我停止濫用'awakeFromNib' – TheAmateurProgrammer

+0

viewDidLoad聽起來像是要走的路 – Carlos

相關問題