自定义选定的NSTableView Cell图标

时间:2013-12-10 03:46:27

标签: macos cocoa nstableview

我已经使用自定义单元格创建了一个基于NSTableView的视图。每个单元格中都有一个图像(来自网络)。选择显示自定义选择指示符(类似于复选标记)。

当点击任何单元格时,它会将isClicked中名为YES的单元格属性修改为tableViewSelectionDidChange委托中的dispatch async queue。完成后,我将调用重新加载表数据。在重新加载检查时,查看是否选择了该单元格,如果选中,则将显示选择指示符图像。

到目前为止,细胞图像来自本地,但现在正在使用来自网络的细胞图像。这是使用{{1}}加载的。因为表重新加载所有这些图像再次被下载,并且它在屏幕上闪烁。如何避免这种情况?

1 个答案:

答案 0 :(得分:0)

我的解决方案带有丑陋的代码,但有效:

- (void)tableViewSelectionDidChange:(NSNotification *)notification{    

    NSTableView *tableView = [notification object];

    NSInteger row = [tableView selectedRow];

    [self markSelectedCellForTable:tableView withRow:row];

    if ([_foldersList count]) {
        _currentFolder = [_foldersList objectAtIndex:row];

        [tableView scrollRowToVisible:row];
    }else{
        _currentFolder = nil;
    }

    NSLog(@"Folder %@",(_currentFolder)?[_currentFolder title]:@" not selected");
}

- (void)markSelectedCellForTable:(NSTableView *)tableView withRow:(NSInteger)row{

//ui
@try {
        NSTableRowView *rowView;
        NSTableCellView *cellView;
        for (int i=0; i<=[_foldersList count]; i++){

            rowView = [tableView rowViewAtRow:i
                              makeIfNecessary:NO];

            cellView = [[rowView subviews] objectAtIndex:0];

            [[cellView imageView] setHidden:(i!=row)];
        }

    }
    @catch (NSException *exception) {}
}