Я начинаю заниматься разработкой Cocoa для Snow Leopard, и у меня проблема с редактированием значений в массиве данных, отображаемом в NSTableView
.Редактирование источника данных NSTableView
Я попытался изменить свойство своего объекта в -tableView:setObjectValue:forTableColumn:row:
, и после этого у меня есть EXC_BAD_ACCESS
.
Мой NSTableView
содержит один столбец с ячейками NSButtonCell
, и этот столбец имеет идентификатор «checked».
Мой код прост и выглядит следующим образом:
@interface MyObj: NSObject {
BOOL checked;
}
@property (assign) BOOL checked;
@end
@imlpementation MyObj
@synthesize checked;
@end
@interface MyAppDelegate: NSObject <NSApplicationDelegate, NSTableViewDelegate, NSTableViewDataSource> {
NSMutableArray *data;
NSTableView *table;
}
@property (assign) IBOutlet NSTableView *table;
- (NSInteger) numberOfRowsInTableView:(NSTableView *)aTableView;
- (id) tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex;
- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex;
@end
@implementation MyAppDelegate
@synthesize table;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
data = [[NSMutableArray array] retain];
// some code that add few objects to data
// each object is instance of MyObj and I call alloc+init+retain for each
// ...
[table reloadData];
}
- (void)dealloc {
[data release];
[super dealloc];
}
- (NSInteger) numberOfRowsInTableView:(NSTableView *)aTableView {
return (data == nil ? 0 : [data count]);
}
- (id) tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
MyObj *obj;
obj = [data objectAtIndex:rowIndex];
NSString *identifier;
identifier = [aTableColumn identifier];
return [obj performSelector:NSSelectorFromString(identifier)];
}
- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
MyObj *obj;
obj = [data objectAtIndex:rowIndex];
NSString *identifier;
identifier = [aTableColumn identifier];
if ([identifier isEqualTo:@"checked"]) {
BOOL value = [anObject boolValue];
obj.checked = value;
[data replaceObjectAtIndex:rowIndex withObject:obj];
}
[table reloadData];
}
@end
И я поднял objc_msgSend_vtable5
от -[NSButtonCell setObjectValue]
метода.
На какой линии вы получили сообщение об ошибке? Кроме того, учитывая, что «MyObj», по-видимому, изменен - вы устанавливаете свойство «checked» для одного - вам не нужно заменять его в массиве 'data'. Вы изменили тот, который уже находится в 'data'. (По отдельному вопросу я бы рекомендовал '[obj valueForKey: identifier]' вместо '[obj performSelector: NSSelectorFromString (identifier)]'.) –
У меня появилась ошибка после '-tableView: setObjectValue: forTableColumn: row:' обработанный. Я использую объект replace в массиве только для исправления этой ошибки. Это не работает. :) – nornad
Этот метод '- [NSButtonCell setObjectValue]' выполняется через среду Cocoa после '-tableView: setObjectValue: forTableColumn: row:' заканчивается. – nornad