NSTableView вставляет строки / перезагружает данные без прокрутки [дубликат]

Использование left: calc(50% - Wpx/2);, где W - ширина элемента, работает для меня.

4
задан tarmes 9 January 2014 в 18:12
поделиться

2 ответа

Я нашел решение своей проблемы, что я доволен:

[_tableView insertRowsAtIndexes:indexSet withAnimation:NSTableViewAnimationEffectGap];

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    NSUInteger firstIndex = [indexSet firstIndex];
    [_tableView scrollRowToVisible:firstIndex];
}];

Я просто задерживаю запрос прокрутки до следующего цикла цикла.

1
ответ дан tarmes 22 August 2018 в 16:41
поделиться
  • 1
    Я попытался использовать это, чтобы прокручивать нижнюю часть таблицы, после вставки строки в конец, и она просто прокручивается до второй до последней строки. Есть идеи? – rocky 16 May 2014 в 21:32

У нас были проблемы с этим, поэтому мы закончили выполнение прокрутки, как и другие анимации, чтобы сохранить строку на экране. Вы бы назвали этот код внутри вашей анимационной группы, где вы изменяете таблицу.

Код выглядит следующим образом:

- (BOOL)scrollRowToVisible:(NSInteger)row animate:(BOOL)animate;
{
    LIClipView *const clipView = (id)_sourceListOutlineView.enclosingScrollView.contentView;
    const NSRect finalFrameOfRow = [_sourceListOutlineView rectOfRow:row];
    const NSRect clipViewBounds = clipView.bounds;

    if (NSIsEmptyRect(finalFrameOfRow) || _sourceListOutlineView.numberOfRows <= 1)
        return NO;

    const NSRect finalFrameOfLastRow = [_sourceListOutlineView rectOfRow:(_sourceListOutlineView.numberOfRows - 1)];
    if (NSMaxY(finalFrameOfLastRow) <= NSHeight(clipViewBounds))
        // The source list is shrinking to fully fit in its clip view (though it might still be larger while animating); no scrolling is needed.
        return NO;

    if (NSMinY(finalFrameOfRow) < NSMinY(clipViewBounds)) {
        // Scroll top of clipView up to top of row
        [clipView scrollToPoint:(NSPoint){0, NSMinY(finalFrameOfRow)} animate:animate];
        return YES;
    }

    if (NSMaxY(finalFrameOfRow) > NSMaxY(clipViewBounds)) {
        // Scroll bottom of clipView down to bottom of source, but not such that the top goes off-screen (i.e. repeated calls won't keep scrolling if the row is higher than visibleRect)
        [clipView scrollToPoint:(NSPoint){0, MIN(NSMinY(finalFrameOfRow), NSMaxY(finalFrameOfRow) - NSHeight(clipViewBounds))} animate:animate];
        return YES;
    }

    return NO;
}
1
ответ дан Wil Shipley 22 August 2018 в 16:41
поделиться
  • 1
    Привет, Вил. Мне кажется, что проблемы связаны с тем, что строки не существуют до тех пор, пока не будет выполнена вставка. Я пробовал отложить мой вызов scrollToRow на 0,1 секунды (используя dispatch_after), и это решает проблему. Чувствует себя взломанным. Я не мог легко проверить ваш код, поскольку scrollToPoint не является определенной функцией. – tarmes 9 January 2014 в 21:44
  • 2
    О, мы добавили параметр animate: к нашему подклассу clipView, это правильно. Кажется странным, что вы не можете ссылаться на строку сразу после вставки, даже если анимация продолжается, но весь этот код довольно новый. – Wil Shipley 10 January 2014 в 02:07
Другие вопросы по тегам:

Похожие вопросы: