2012-05-02 14 views
2

私は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を調達しています。

+1

どのラインでエラーが発生しましたか?また、 'MyObj'が明らかに変更可能であることを考えると、' checked'プロパティーを 'data'配列に置き換える必要はありません。既に 'data'にあるものを修正しました。 (別の主題では、 '[obj performSelector:NSSelectorFromString(identifier)]'の代わりに '[obj valueForKey:identifier]'をお勧めします。) –

+1

'-tableView:setObjectValue:forTableColumn:row:'処理される。私はこのエラーを修正するためだけに配列のオブジェクトを置き換えます。作品ではありません。 :) – nornad

+1

この ' - [NSButtonCell setObjectValue]'メソッドは、 '-tableView:setObjectValue:forTableColumn:row:'の後にCocoaフレームワークによって実行されます。 – nornad

答えて

2

私の問題の解決策が見つかりました。私はBOOL checkedNSNumber *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

関連する問題