2012-02-18 9 views
0

NSTableViewにNSArrayの内容を表示する方法を理解する助けが必要です。私のNSArrayは、ディレクトリのファイル名で埋まっています。 NSFileManagerを使用してディレクトリ内のファイル名を取得し、その情報をNSArrayにロードします。しかし、NSArrayをNSTableViewにロードする方法を理解することはできません。NSTableViewにファイル名のNSArrayを追加するにはどうすればいいですか? - ココア

AppDelegate.h

#import <Cocoa/Cocoa.h> 

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

NSArray *list; 
IBOutlet NSTextField *text; 

NSFileManager *manager; 
NSString *path; 
NSString *pathFinal; 
} 

@property (assign) IBOutlet NSWindow *window; 

- (IBAction)listArray:(id)sender; 

@end 

AppDelegate.m

#import "AppDelegate.h" 

@implementation AppDelegate 

@synthesize window = _window; 

- (int)numberOfRowsInTableView:(NSTableView *)tableView 
{ 
    return [list count]; 
} 

- (id)tableView:(NSTableView *)tableView 
objectValueForTableColumn:(NSTableColumn *)tableColumn 
     row:(int)row 
{ 
    return [list objectAtIndex:row]; 
} 

- (IBAction)listArray:(id)sender { 
    path = @"~/Library/Application Support/minecraft/bin/"; 
    pathFinal = [path stringByExpandingTildeInPath]; 
    list = [manager directoryContentsAtPath:pathFinal]; 

    [tableView reloadData]; 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 

} 

@end 

答えて

1

これを行う2つの方法があります:Cocoa BindingsNSArrayControllerを使用するか、オブジェクトにNSTableDataSourceプロトコルを実装したように、そのオブジェクトを割り当てることテーブルビューのdatasource

すでにNSTableViewDataSourceメソッドを半分実装しているようです。あなたのAppDelegateオブジェクトがプロトコルを実装していることを示すために、あなたのインターフェイスに、プロトコルの宣言を追加する必要があります。

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource> 

理論的にはすべてが動作する必要があるので、あなたはすでに、必要なデータソースのメソッドを実装しているが、あなたはおそらく設定していませんAppDelegateオブジェクトがテーブルビューのdatasourceとして表示されます。あなたは、コード内でこれを行うことができます:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    [tableView setDatasource:self]; 
} 

また、あなたはあなたのAppDelegateインスタンスにテーブルビューのdatasourceアウトレットを設定することによって、Interface Builderでデータソースを割り当てることができます。

しかし、あなたが持っている主な問題は、あなたのlist ivarに自動リリースされたオブジェクトを割り当てており、テーブルビューがリロードされる前にリリースされていることです。

listArrayメソッドは問題があります。 pathpathFinalをインスタンス変数にする理由はありません。それらは一度だけ使用されるため、ローカルスコープにする必要があります。実際には、pathが一定であるため、それは個別に宣言する必要があります。

の.hを:

//this should go in the top of your .m file, after the #import directives 
static NSString* minecraftPath = @"~/Library/Application Support/minecraft/bin/"; 

- (IBAction)listArray:(id)sender 
{ 
    NSString* path = [minecraftPath stringByExpandingTildeInPath]; 

    //you want to hang onto the array that is returned here, so you must retain it 
    //however, if you don't release the existing value, it will be leaked 
    [list release]; 
    list = nil; 
    list = [[manager directoryContentsAtPath:pathFinal] retain]; 
    [tableView reloadData]; 
} 

- (void)dealloc 
{ 
    //because you retained it, you must release it 
    [list release]; 
    [super dealloc]; 
} 

これを行うにはもっと良い方法は、プロパティとしてlistを宣言し、そのアクセサを合成するために、次のようになります。

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource> { 
... 
} 
... 
@property (retain) NSArray* list; 
... 

.M:

@implementation AppDelegate 
@synthesize list; 
... 

あなたは、プロパティを使用することができますし、それはあなたのために/保持解放を処理します。

- (IBAction)listArray:(id)sender 
{ 
    NSString* path = [minecraftPath stringByExpandingTildeInPath]; 

    //you've set the property to use retain, so the synthesized accessor does that for you 
    self.list = [manager directoryContentsAtPath:pathFinal]; 
    [tableView reloadData]; 
} 

- (void)dealloc 
{ 
    //you still need to release when done 
    self.list = nil; 
    [super dealloc]; 
} 
+0

私は悩みこれが動作するようになってを抱えています。それは何もしていないだけで、私はログにエラーが出ない。 NSTableDataSourceプロトコルを記述すると、見つからず、NSTableViewDataSourceに変更するように指示されましたが、それが問題かどうかはわかりません。私はIBとデリゲートのデータソースとしてテーブルを設定していますが、何も起こっていません。また、directoryContentsAtPathは推奨されなくなりました。 – drewsdunne

+0

申し訳ありませんが、それは私のプロトコル名の間違いです、それは 'NSTableViewDataSource'です。テーブルビューをデータソースとして設定しない場合は、 'AppController'オブジェクトをテーブルビューのデータソースとして設定します。テーブルビューの 'datasource'コンセントを' AppController'インスタンスに接続します。 'directoryContentsAtPath' ***は***が推奨されていません。ドキュメントを見ると、代わりに 'contentsOfDirectoryAtPath:error:'を使用するよう指示されます。 –

+0

申し訳ありませんが、私は間違いを犯しました、私はそれを誤って言いました。私はテーブルビューの 'datasource'を' AppController'に接続しました。しかし、まだテーブルに何も表示されておらず、 'contentsOfDirectoryAtPath:error:'のインスタンスメソッドはないと言います。 – drewsdunne

関連する問題