Как программно добавить прокручиваемый NSTableView - PullRequest
5 голосов
/ 12 марта 2010

Я пытаюсь добавить табличное представление к представлению в коде вместо использования Interface Builder, и, к сожалению, это вызывает некоторые проблемы = (

Вот пример того, как я делаю это сейчас.

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

resultsScrollView.documentView = tableView;

[someView addSubview: scrollView];

Таким образом, я просто помещаю tableView в scrollView (потому что это то, что делает IB), а затем добавляю последний как подпредставление someView. В результате появляется tableView, но нет данныхпоказано в табличном представлении. Отладка показывает, что у источника данных запрашивается количество строк в табличном представлении, но метод:

tableView:objectValueForTableColumn:row:

никогда не вызывается. Я подозреваю, что это из-за моего способасоздание tableView.

Я пробовал google, но не повезло, и «Руководство по программированию представлений таблиц» на macdevcenter также не помогло. Что мне не хватает?

Заранее спасибо...

Ответы [ 3 ]

16 голосов
/ 13 марта 2010

Я создал пример проекта по умолчанию, а затем сделал следующее:

- (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

(О, к синтаксису точки-c, просто скажите нет.: -)

7 голосов
/ 13 марта 2010

В результате появляется tableView, но в tableView данные не отображаются.Отладка показывает, что у источника данных запрашивается количество строк в tableView, но метод:

tableView:objectValueForTableColumn:row:

никогда не вызывается.

Он не запрашивает у вас объектзначения для любых столбцов, потому что он не имеет никаких столбцов.Создайте несколько NSTableColumn экземпляров и добавьте их в табличное представление .

0 голосов
/ 12 марта 2010

Из вашего примера не видно, что вы помещаете tableView в scrollView. Это добавляется как подпредставление где-то, что вы нам не показываете?

Кроме того, вы уверены, что вам нужно отдельное представление прокрутки? Разве TableView не осуществляет прокрутку уже?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...