macos - NSTableView数据源编辑

标签 macos cocoa osx-snow-leopard nstableview nsbuttoncell

我只是为 Snow Leopard 开发 Cocoa 的初学者,在编辑 NSTableView 中显示的数据数组中的值时遇到问题。

我尝试在 -tableView:setObjectValue:forTableColumn:row: 中编辑对象的某些属性,此后我有 EXC_BAD_ACCESS

我的 NSTableView 包含一列,其中包含 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

我从 -[NSButtonCell setObjectValue] 方法中提出了 objc_msgSend_vtable5

最佳答案

我找到了解决问题的方法。我将 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];
}

现在一切正常。我希望它对某人有帮助。

关于macos - NSTableView数据源编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10421091/

相关文章:

python - 在 MacOS 上每小时执行一次 Python 脚本

cocoa - 两个 NSArrayController 和一个关系 (CoreData)

xcode - 如何从头开始以编程方式创建 NSCollectionView?

c++ - qmenu 不适用于 MAC (Qt Creator)

java - 在 Java 中验证 Mac 本地用户

python - 雪豹上的 PyODBC - 安装错误

android - Mac HAX 不工作,模拟器以模拟模式运行

objective-c - 在 Cocoa 应用程序上接受拖动的文件

php - ffmpeg MAMP "dyld: Library not loaded"错误

macos - 阻止我的 Cocoa 应用程序出现 "Resume"?