NSTableView 数据源不起作用



我正在尝试用NSArray填充NSTableView。我有一个视图控制器,我已将其设置为我的数据源,但是每次运行该程序时,都会收到此错误: 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数组像普通数组一样填充。

感谢您的任何帮助。

首先通过 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 of table view。

首先,不需要在 .h 文件中声明方法,因为它们是类正在实现的协议的一部分。而且你真的设置了数据源吗?你在什么地方做过这样的事情吗?

self.tableView.dataSource = self;

最新更新