代码之家  ›  专栏  ›  技术社区  ›  Jakob Dam Jensen

如何以编程方式添加可滚动的InstableView

  •  5
  • Jakob Dam Jensen  · 技术社区  · 16 年前

    我试图在代码中向视图添加TableView,而不是使用InterfaceBuilder,但很不幸,它导致了一些问题。=(

    下面是一个我现在如何做的例子。

    NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:someRect];
    NSTableView *tableView = [[NSTableView alloc] initWithFrame: scrollView.bounds];
    resultsTableView.dataSource = self;
    
    resultsScrollView.documentView = tableView;
    
    [someView addSubview: scrollView];
    

    所以基本上我只是把TableView放在滚动视图中(因为这就是ib所做的),然后将后者添加为someview的子视图。结果是出现了一个TableView,但TableView中没有显示任何数据。调试显示正在向数据源询问TableView中有多少行,但方法:

    tableView:objectValueForTableColumn:row:
    

    永远不会被召唤。我怀疑这是因为我创建TableView的方式。

    我试过谷歌,但没有运气,而且MacDevCenter上的“表视图编程指南简介”也没有帮助。我错过了什么?

    事先谢谢…

    3 回复  |  直到 16 年前
        1
  •  7
  •   Peter Hosey    16 年前

    结果是出现了一个TableView,但TableView中没有显示任何数据。调试显示正在向数据源询问TableView中有多少行,但方法:

    tableView:objectValueForTableColumn:row:
    

    永远不会被召唤。

    它不会要求您为任何列提供对象值,因为它没有任何列。创造一些 NSTableColumn 实例和 add them to the table view .

        2
  •  16
  •   ericg    16 年前

    我创建了默认的示例项目,然后执行了以下操作:

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
    {
        NSRect          scrollFrame = NSMakeRect( 10, 10, 300, 300 );
        NSScrollView*   scrollView  = [[[NSScrollView alloc] initWithFrame:scrollFrame] autorelease];
    
        [scrollView setBorderType:NSBezelBorder];
        [scrollView setHasVerticalScroller:YES];
        [scrollView setHasHorizontalScroller:YES];
        [scrollView setAutohidesScrollers:NO];
    
        NSRect          clipViewBounds  = [[scrollView contentView] bounds];
        NSTableView*    tableView       = [[[NSTableView alloc] initWithFrame:clipViewBounds] autorelease];
    
        NSTableColumn*  firstColumn     = [[[NSTableColumn alloc] initWithIdentifier:@"firstColumn"] autorelease];
        [[firstColumn headerCell] setStringValue:@"First Column"];
        [tableView  addTableColumn:firstColumn];
    
        NSTableColumn*  secondColumn        = [[[NSTableColumn alloc] initWithIdentifier:@"secondColumn"] autorelease];
        [[secondColumn headerCell] setStringValue:@"Second Column"];
        [tableView  addTableColumn:secondColumn];
    
        [tableView setDataSource:self];
        [scrollView setDocumentView:tableView];
    
        [[[self window] contentView] addSubview:scrollView];
    
    }
    
    
    
    - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
    {
        return 100;
    }
    
    
    - (id) tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
    {
        NSString* cellValue = [NSString stringWithFormat:@"%@ %ld", [aTableColumn identifier], (long)rowIndex];
    
        return cellValue;
    }
    

    你可以抓取示例应用程序 TableViewInCode

    (哦,对于objective-c点语法,只需说no.:-)

        3
  •  0
  •   David Gelhar    16 年前

    (从您的示例中)不会显示您正在将TableView放入ScrollView中。它是否被添加为一个子视图,而您没有显示给我们?

    另外,您确定需要单独的滚动视图吗?TableView是否已经实现滚动?