0

私はCocoaを初めて使用し、配列に基づくテーブルビューをセットアップしようとしています。アプリデリゲートをテーブルビューのデータソースとして設定し、NSTableViewDataSourceプロトコルを実装しました。

アプリを実行すると、次のログ出力が得られます。

2012-06-23 18:25:17.312 HelloWorldDesktop[315:903] to do リストはありません
2012-06-23 18:25:17.314 HelloWorldDesktop[315:903] 行数は 0 です
2012-06-23 18:25 :17.427 HelloWorldDesktop[315:903] アプリの起動が完了しました

reloadDatatableView を呼び出すと、ビューを更新するために再度呼び出されると思いましnumberOfRowsInTableView:(NSTableView *)tableViewたが、それは起こっていないようです。私は何を逃したのですか?

私の .h と .m のリストは以下のとおりです。

AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource> 

@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSTableView * toDoListTableView;

@property (assign) NSArray * toDoList;

@end

AppDelegate.m

#import "AppDelegate.h"

@implementation AppDelegate 

@synthesize window = _window;
@synthesize toDoList; 
@synthesize toDoListTableView;

- (void)dealloc
{
    [self.toDoList dealloc];
    [super dealloc];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSLog(@"App did finish launching");
    // Insert code here to initialize your application
  //  toDoList = [[NSMutableArray alloc] init];
    toDoList = [[NSMutableArray alloc] initWithObjects:@"item 1", @"item 2", nil];
    [self.toDoListTableView reloadData];
   // NSLog(@"table view %@", self.toDoListTableView);

}

//check toDoList initialised before we try and return the size
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView {
    NSInteger count = 0;
    if(self.toDoList){
        count = [toDoList count];
    } else{
        NSLog(@"to do list is nil");
    }
    NSLog(@"Number of rows is %ld", count);
    return count;
}

-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSLog(@"in objectValueForTable");
    id returnVal = nil;

    NSString * colId = [tableColumn identifier];

    NSString * item = [self.toDoList objectAtIndex:row];

    if([colId isEqualToString:@"toDoCol"]){
        returnVal = item;
    } 

    return returnVal;

}

@end
4

2 に答える 2

1

最初に確認することは、NSTableView IBOutlet がまだ applicationDidFinishLaunching に設定されていることです。

NSLog(@"self.toDoListTableView: %@", self.toDoListTableView)

次のような出力が表示されます。

<NSTableView: 0x178941a60>

コンセントが正しく設定されている場合。

オブジェクトではなく「nil」が表示される場合は、NSTableView が Xcode の XIB 編集モードでアウトレットに接続されていることを再確認してください。コンセントの接続を支援するためのドキュメント リンクを次に示します。

于 2012-06-23T17:43:22.940 に答える
0

私はそれを修正しました-appDelegateをデータソースとして設定し、tableViewのデリゲートを設定しましたが、ctrlキーを押しながらtableViewからappDelegateにドラッグしましたが、他の方法でctrlキーを押しながらドラッグしてアウトレットを実際にリンクしていませんでしたテーブルビューで宣言されています。それは今働いています。助けてくれてありがとう、ジェフ。

于 2012-06-23T18:17:08.963 に答える