2

私はSnowLeopard用に開発しているCocoaの初心者であり、に表示されるデータ配列の値の編集に問題がありますNSTableView

でオブジェクトのプロパティを編集しようとしました-tableView:setObjectValue:forTableColumn:row:EXC_BAD_ACCESS、この後です。

MyにはセルをNSTableView含む1つの列がNSButtonCellあり、この列の識別子は「チェック済み」です。

私のコードは単純で、次のようになります。

@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]

4

1 に答える 1

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];
}

そして、今はすべて正常に動作しています。私はそれが誰かを助けることを願っています。

于 2012-05-07T16:50:02.473 に答える