【问题标题】:NSTableView ViewBased never calling the needed delegateNSTableView ViewBased 从不调用所需的委托
【发布时间】:2018-07-20 09:38:02
【问题描述】:

我有一个 NSTableView,我希望在其中显示信息列表。 目前viewForTableColumn 方法委托从不运行,但numberOfRowsInTableView 会。

我在 ViewController 头中设置了 NSTableViewDelegate 和 NSTableViewDataSource。我将 tableview 委托和数据源设置为 self.有人知道为什么它不会运行吗?我在下面添加了屏幕截图和代码。

ViewController.h

@interface ViewController : NSViewController <NSTableViewDelegate, NSTableViewDataSource>

@property (strong) IBOutlet NSTableView *tableView;
@property (strong, nonatomic) NSMutableArray<App *> *installedApps;

@end

ViewController.m

 - (void)viewDidLoad {
    [super viewDidLoad];

    _installedApps = [[NSMutableArray alloc] init];

    _tableView.dataSource = self;
    _tableView.delegate = self;

    // Other stuff that populates the array
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return _installedApps.count;
}

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSTableCellView *result = [tableView makeViewWithIdentifier:@"appCell" owner:self];
    result.textField.stringValue = @"Hello world";

    return result;
}

视图位于容器视图中,我将“appCell”标识符设置为表格单元格视图。

【问题讨论】:

  • 顺便说一句:您应该使用访问器。使用self.installedApps 而不是_installedApps,因为后者可能会产生KVO 和子类化问题。
  • 填充数组时你会打电话给[self.tableView reloadData]吗?
  • _tableView nil?
  • @Willeke Nope not nil.
  • @clemens 谢谢,我将从现在开始这样做。

标签: objective-c macos nstableview


【解决方案1】:

这太奇怪了,但我遇到了同样的问题,一切都正确连接,被调用的行数,但不是 viewForTableColumn... 最后,以下答案被证明是解决方案:

https://stackoverflow.com/a/13091436/3963806

基本上,我直接从对象库中设置了tableview,没有布局约束等......一旦我添加了布局约束,该方法就开始被调用......我可以看到超级奇怪并点击“行”,但它们没有正确填充......我认为这取决于链接答案中提到的剪辑。

【讨论】:

    【解决方案2】:

    我在屏幕截图中看不到它,但是...视图层次结构(表格单元视图)中突出显示的行是带有 appCell 标识符的那一行吗?

    [分钟过去...]

    哎呀;对不起。我看到你在上面已经注意到了。

    我问的原因是我从您的代码中创建了一个新项目,将数组类型从 App 更改为 NSString,向情节提要添加了一个单列表视图,将其链接到代码,添加了几个实体到-viewDidLoad 中的数组,并且——一旦我将 appCell 标识符放在正确的位置(duh)——一切正常。

    【讨论】:

    • 那么你把 appCell 标识符放在哪里了?
    • (抱歉耽搁了。)您所做的同一个地方:在表格单元格视图(NSTableCellView 类)上。起初我把它放在表格视图单元格(NSTextFieldCell 类)上。
    【解决方案3】:

    数组_installedApps 为空,numberOfRowsInTableView: 返回 0。因此,tableView:viewForTableColumn: 不会被调用,因为没有要显示的行。没有行也意味着没有列。

    您还应确保已在表格视图的属性检查器中将表格视图配置为基于视图

    【讨论】:

    • 即使我在其中硬编码一个数字仍然不会调用 tableView:viewForTableColumn:
    • @John:您的表格视图是否配置为基于视图
    • 还要确保两个您的代表都已连接。 numberOfRowsInTableView:NSTableViewDataSource 方法,而 tableView:viewForTableColumn:NSTableViewDelegate 方法。虽然两者都可以由同一个对象实现,但两个表视图出口都必须设置为该对象。
    • @JamesBucanek:委托和数据源连接正确,见源码。
    • @clemens 哎呀/duh——我不知道我是怎么错过的。我责怪这次流感。好的,如果这是所有代码,那么可能至少还有一个缺失的部分:tableView:objectValueForTableColumn:row:。如果您的表没有使用绑定,那么我相信您需要实现此数据源方法。虽然 -tableView:objectValueForTableColumn:row: 获取所有自己的数据表面上是多余的,但我相信框架仍然需要它,如果不实施,可能会简单地拒绝运行。
    猜你喜欢
    • 2018-03-15
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多