私はSnow Leopard用に開発したCocoaの初心者です。NSTableView
に表示されたデータ配列の値を編集する際に問題があります。NSTableViewデータソースの編集
私のオブジェクトのいくつかのプロパティを-tableView:setObjectValue:forTableColumn:row:
に編集しようとしましたが、その後にEXC_BAD_ACCESS
があります。
私のNSTableView
には、1つの列に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
そして私は-[NSButtonCell setObjectValue]
方法からobjc_msgSend_vtable5
を調達しています。
どのラインでエラーが発生しましたか?また、 'MyObj'が明らかに変更可能であることを考えると、' checked'プロパティーを 'data'配列に置き換える必要はありません。既に 'data'にあるものを修正しました。 (別の主題では、 '[obj performSelector:NSSelectorFromString(identifier)]'の代わりに '[obj valueForKey:identifier]'をお勧めします。) –
'-tableView:setObjectValue:forTableColumn:row:'処理される。私はこのエラーを修正するためだけに配列のオブジェクトを置き換えます。作品ではありません。 :) – nornad
この ' - [NSButtonCell setObjectValue]'メソッドは、 '-tableView:setObjectValue:forTableColumn:row:'の後にCocoaフレームワークによって実行されます。 – nornad