0

NSTableView に NSArray を設定しようとしています。データソースとして設定したView Controllerがありますが、プログラムを実行するたびに、このエラーが発生します: Must implement numberOfRowsInTableView: and tableView:objectValueForTableColumn:row:、両方とも実装しました。これが私のヘッダーです:

#import <Cocoa/Cocoa.h>

@interface ChatViewController : NSViewController <NSTableViewDataSource>

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

@end

そして、ここに私の実装ファイルがあります:

#import "ChatViewController.h"
#import "Socket.h"

@interface ChatViewController ()

@property (strong) IBOutlet NSTableView *people;
@property (strong) IBOutlet NSTextField *message;
@property (strong) IBOutlet NSButton *send;

@property (strong) Socket *sock;

@property (strong, nonatomic) NSString *recievedText;
@property (strong, nonatomic) NSArray *tableData;

- (void)updateUI;

@end

@implementation ChatViewController

@synthesize sock;
@synthesize recievedText;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [self.people setDataSource:self];
        sock = [[Socket alloc] init];
        [sock connectToServerWithIP:@"127.0.0.1" andPort:5001];
        [self updateUI];
    }
    return self;
}

- (void)updateUI
{
    [sock sendMessage:@"getPeople"];
    recievedText = [NSString stringWithString:[sock recieveMessage]];
    self.tableData = [recievedText componentsSeparatedByString:@";"];
    NSLog(@"%@", self.tableData);

    [self.people reloadData];
    NSLog(@"%@", self.people);
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
    return [self.tableData count];
}

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

@end

Socketサーバーへのソケットを開閉するために作成したクラスで、完全に機能します。tableData配列は、通常の配列のように設定されます。

助けてくれてありがとう。

4

2 に答える 2

2

まず、クラスが実装しているプロトコルの一部であるため、.h ファイルでメソッドを宣言する必要はありません。また、本当にデータ ソースを設定しましたか? どこかでこのようなことをしたことがありますか?

self.tableView.dataSource = self;
于 2013-10-08T14:05:39.007 に答える
2

まず、xib を使用して、テーブル ビューのデリゲートとファイルの所有者のデータ ソースを作成します。

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
    if(aTableView == tableViewS)
    {
        if([[aTableColumn identifier] isEqualToString:@"first"])
        {
            return [self.tableData objectAtIndex:rowIndex];
        }
    }
    return nil;
}

テーブル列の識別子名を指定する必要があります

tableViewS は、テーブル ビューの IBOutlet です。

于 2013-10-08T14:05:01.467 に答える