6

我是可可的新手,我很沮丧,我花了将近半天的时间试图找出如何将 NSView 添加到 NSTableView 单元格,但我还没有找到一个很好的指南来帮助我做什么我想实现,也许有人可以看看我尝试过的东西并告诉我为什么它不起作用以及如何让它起作用......

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
NSTableCellView *view = [tableView makeViewWithIdentifier:@"MyView" owner:self];
NSTextField *textfield = [[NSTextField alloc]initWithFrame:NSMakeRect(0, 0, 100, 30)];
[textfield setStringValue:predictate_search[row]];
[textfield setBackgroundColor:[NSColor redColor]];
[view addSubview:textfield];
[view setNeedsDisplay:YES];
return view;
}

我想要实现的是让两个 NSTextFields 在彼此之上,并且表格单元格具有自定义背景。以上是我只是想让一个 NSTextField 工作,但没有运气......

NSTableView 正在以编程方式创建:

NSScrollView *scrollView = [[NSScrollView alloc]initWithFrame:bg];
    [scrollView setHasVerticalScroller:YES];
    [self addSubview:scrollView];

    search_results = [[NSTableView alloc]initWithFrame:bg];
    NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"id"];
    [[column headerCell] setStringValue:@"Cities"];
    [column setWidth:1000.0];

    [search_results addTableColumn:column];
    [search_results setDelegate:(id)self];
    [search_results setDataSource:(id)self];
    [search_results reloadData];

    [scrollView setDocumentView:search_results];

我有点困惑该放什么makeViewWithIdentifier:,我已经在 NSTableViews 上观看了WWDC 2011视频,但我仍然不确定。

如果您需要更多信息,请询问

谢谢

编辑 第一次回答后:

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
NSTableCellView *view = [tableView makeViewWithIdentifier:[tableColumn identifier] owner:self];
if(view == nil){
    NSTableCellView *view = [[NSTableCellView alloc]initWithFrame:[tableView frame]];
    view.identifier = [tableColumn identifier];
}
NSTextField *textfield = [[NSTextField alloc]initWithFrame:NSMakeRect(0, 0, 100, 30)];
[textfield setStringValue:predictate_search[row]];
[textfield setBackgroundColor:[NSColor redColor]];
[view addSubview:textfield];
[view setNeedsDisplay:YES];
return view;

}

但是它仍然无法正常工作?

4

3 回答 3

7

下面的代码解决了我的问题:

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
NSView *view = [tableView makeViewWithIdentifier:@"MyView" owner:self];

if (view == nil) {
    view = [[NSView alloc]initWithFrame:NSMakeRect(0, 0, 100, 30)];
    NSTextField *result = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 25, 800, 25)];
    NSTextField *result2 = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 800, 25)];
    result.stringValue = [predictate_search objectAtIndex:row];
    result2.stringValue = @"UnitedKingdom";
    [view addSubview:result];
    [view addSubview:result2];
    [view setNeedsDisplay:YES];
}

return view;

}

感谢您的帮助:)

于 2012-11-11T20:08:21.997 回答
1

如果它不是可取消队列的,则返回单元格的方法必须使该单元格(因为不存在)

// There is no existing cell to reuse so we will create a new one
if (result == nil) {

     // create the new NSTextField with a frame of the {0,0} with the width of the table
     // note that the height of the frame is not really relevant, the row-height will modify the height
     // the new text field is then returned as an autoreleased object
     result = [[[NSTextField alloc] initWithFrame:...] autorelease];

     // the identifier of the NSTextField instance is set to MyView. This
     // allows it to be re-used
     result.identifier = @"MyView";
  }
于 2012-11-11T18:53:42.100 回答
1

好吧,看看这个,我将添加一个答案,以防将来有人偶然发现这个问题。

view 在代码片段的第二行中定义。如果它为 nil,它会落入 if 语句并再次定义视图。in 语句产生的视图消失了,因为它是在方括号的范围内定义的,并且当程序离开该范围时死掉,留下原始的 nil。

现在可能会有更多的问题,但这很突出。我正在对该主题进行一些研究,发现了这个问题并注意到了范围界定问题。

于 2017-01-23T14:13:28.427 回答