2012-05-02 2 views
2

Я начинаю заниматься разработкой 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] метода.

+1

На какой линии вы получили сообщение об ошибке? Кроме того, учитывая, что «MyObj», по-видимому, изменен - ​​вы устанавливаете свойство «checked» для одного - вам не нужно заменять его в массиве 'data'. Вы изменили тот, который уже находится в 'data'. (По отдельному вопросу я бы рекомендовал '[obj valueForKey: identifier]' вместо '[obj performSelector: NSSelectorFromString (identifier)]'.) –

+1

У меня появилась ошибка после '-tableView: setObjectValue: forTableColumn: row:' обработанный. Я использую объект replace в массиве только для исправления этой ошибки. Это не работает. :) – nornad

+1

Этот метод '- [NSButtonCell setObjectValue]' выполняется через среду Cocoa после '-tableView: setObjectValue: forTableColumn: row:' заканчивается. – nornad

ответ

2

Я нашел решение для своей проблемы. Я изменил BOOL checked на NSNumber *checked.

- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { 
    MyObj *obj = (MyObj *)[data objectAtIndex:rowIndex]; 
    NSString *identifier; 
    identifier = [aTableColumn identifier]; 

    if ([identifier isEqualTo:@"checked"]) { 
     [obj setValue:[[NSNumber numberWithBool:[anObject boolValue]] retain] forKey:[aTableColumn identifier]]; 
    } 

    [table reloadData]; 
} 

И все работает отлично прямо сейчас. Надеюсь, это поможет кому-то.

+0

Мой метод tableView: setObjectValue ... вообще не вызван. Я нашел комментарий в заголовках Apple, в котором говорится, что этот метод вызывается только для табличных представлений на основе ячеек, а не для табличных представлений на основе представлений. Я понимаю, что табличные представления в ячейках устарели. Я хочу использовать представления таблиц на основе представления, но я не уверен, что делать, чтобы мои просмотры таблиц редактировались. – Kaydell

Смежные вопросы