我有名为ListCell的自定义单元格的NSOutlineView。我将标签和图标设置为我的自定义单元格。然后NSOutlineView在错误exc_bad_access code = 13时崩溃。你有什么想法,如何修理它?感谢回复。
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
return [[[DataSingleton sharedData] pages] count];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
return NO;
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
return item;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
ListTableCellView *cell = [outlineView makeViewWithIdentifier:@"ListCell" owner:self];
cell.label.stringValue = [NSString stringWithFormat:@"%ld", index + 1];
[cell.label setBackgroundColor:[NSColor clearColor]];
if ([self.icons objectForKey:[NSString stringWithFormat:@"%ld", index]])
[[cell icon] setImage:[self.icons objectForKey:[NSString stringWithFormat:@"%ld", index]]];
return cell;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item {
return YES;
}
答案 0 :(得分:1)
这些方法是数据源委托方法。因此,他们应该只关心处理数据。你在这做什么对我没有意义。
视图将期望它可以在其表格单元格的setStringValue:
等方法中使用的后退对象。在-outlineView:objectValueForTableColumn:byItem:
中提供自定义单元格可能会让人感到困惑。
另外,我认为你没有正确处理这些计数。 -outlineView:numberOfChildrenOfItem:
应该将子项的计数返回到传入的项目。-outlineView:child:ofItem:
中传递的索引可以是介于0和该计数之间的任何位置 - 1.
此外,我认为您需要确保在-reloadData
的调用之间返回的项目是一致的。因此,如果视图要求项目nil的子项5(nil表示“根级别”项目),则每次都应始终返回相同的对象。我没有在任何地方看到过这种情况,但是在我动态生成对象时,我遇到了类似的问题。
答案 1 :(得分:-4)
我只是将NSOutlineView更改为NSTableView,一切正常。