3

NSarrayを使用してNSTableViewで簡単なメニューを作成しようとしています。データソースを作成したクラスに設定すると、EXC_BAD_ACCESSエラーが発生します。奇妙なことは、それはmacrubyで機能しましたか?実装ファイル:

@implementation TableArray

- (id) init
{
    self = [super init];
    if(self) {
        arr = [NSArray arrayWithObjects:@"hey", @"what", @"there", nil];
    }
    return self;
}

- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView 
{
    return [arr count];
}

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn      *)aTableColumn row:(NSInteger)rowIndex
{
    return [arr objectAtIndex:rowIndex];
}

@end

ヘッダ:

@interface TableArray: NSObject <NSTableViewDataSource> {
   NSArray *arr;    
} 

- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView;
- (id) tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn  *)aTableColumn row:(NSInteger)rowIndex;
@end

そしてアプリデリゲートで:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    TableArray *arr = [[TableArray alloc] init];
    [tv setDataSource:arr];
    [tv reloadData];
}

そしてデリゲートヘッダー:

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate> {
   IBOutlet NSTableView *tv;
}

@property (assign) IBOutlet NSWindow *window;

@end
4

2 に答える 2

1

ARCが有効になっているに違いありません(おそらくGC)。NSTableView はそのデータ ソースへの弱い参照を維持しており、同じものへの強い参照を維持していないため、ARC はデータ ソースを処理する前に解放しています。

データ ソースがこのように変動することは非常にまれであることに注意してください。データ ソースはテーブルと基になるデータ ストアの間のパイプであるため、ほぼ確実にアプリのコントロール レイヤーの一部になります。

コードがわずかに異なるか、実装の詳細が原因で、MacRuby で動作する可能性があります。

于 2013-01-14T01:54:32.670 に答える
0

*tv を初期化している場所を知っておくと便利です。アプリの起動時にロードされるNIBファイルに配置したと仮定しています。
次に、IBOutlet NSTableView *tv;理想的にはサブクラスの ViewControllerを配置する必要がありますUITableViewController。tableView 参照/アウトレットがそこに属します。また、viewController 自体を dataSource として使用し、Interface Builder で接続する方が簡単です。

于 2013-01-14T00:50:09.477 に答える