2014-06-19 44 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

相关问题