在基于视图的NSTableView中更改所选视图

时间:2012-04-09 18:21:49

标签: objective-c cocoa nstableview

使用基于视图的NSTableView时,如何更改所选行的视图?具体来说,我想为未选择的行创建一个简单的NSView子类,为所选行创建一个更复杂的NSView子类,它允许编辑与行项相关的更多信息。

一个例子是Things允许您展开正在编辑的项目的方式,如下所示:http://culturedcode.com/things/

3 个答案:

答案 0 :(得分:3)

我的猜测是你想在选择行时使用不同的NSTableCellView子类。我认为你应该可以这样做:

- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
    NSTableView *table = [notification object];
    NSIndexSet *allColumns = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[table tableColumns] count])];
    [table reloadDataForRowIndexes:[table selectedRowIndexes] columnIndexes:allColumns];
}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    if ([[tableView selectedRowIndexes] containsIndex:row])
    {
        // If the row is selected, return an instance of the class for selected views
        SelectedTableCellView *selectedView = ...; // Get from makeViewWithIdentifier:
        // Set up selectedView
        return selectedView;
    }
    else 
    {
        NonSelectedTableCellView *nonSelectedView = ...; // Get from makeViewWithIdentifier:
        // Set up nonSelectedView
        return nonSelectedView;
    }
}

答案 1 :(得分:1)

如果您通过“将视图更改为更复杂的视图”详细阐述了您的意思,那可能会更好。

但是,您可以在表视图的委托中实现- (void)tableViewSelectionDidChange:(NSNotification *)notification,如果可见,则获取所选的NSTableRowView,并以您希望的方式更改它,包括制作它更复杂,扩展它(见下文)等。

要修改行的大小,您需要在同一个委托中实现- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row,并调用表格视图的-noteHeightOfRowsWithIndexesChanged来更新特定行的高度。

答案 2 :(得分:0)

我认为应用程序是由NSOutlineView在outlineview中创建的,只有您可以轻松扩展所选行...

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{        


    if ([item isKindOfClass:[NSDictionary class]]) 
    {
        return YES;        
    }else 
    {
        return NO;
    }
}

我认为这种方式是写的..