如何使用特定索引标识NSTableView中的行对象?

时间:2012-04-18 12:15:20

标签: objective-c cocoa nstableview nsarraycontroller selectedindex

我在InterfaceBuilder中使用NSArrayController来管理在NSTableView中显示的对象。当我选择一行或多行时,将调用以下代码来删除对象并更新选择。

NSIndexSet* selectedRowIndices = [m_tableView selectedRowIndexes];
if (!selectedRowIndices || selectedRowIndices.count < 1) {
    return;
}
[self removeObjectsAtIndices:selectedRowIndices];

// -------------------------------------------------------
// SELECT ROW BELOW OR EQUAL TO THE LAST DELETED ROW.
// -------------------------------------------------------

// Retrieve the highest selection index (lowest row).
NSInteger highestSelectedRowIndex = NSNotFound;
for (NSUInteger index = selectedRowIndices.firstIndex; index < selectedRowIndices.count; ++index) {
    if (index > highestSelectedRowIndex) {
        highestSelectedRowIndex = index;
    }
}
if (highestSelectedRowIndex != NSNotFound && highestSelectedRowIndex < [m_tableView numberOfRows]) {
    // 1) Get the selected object for the highest selected index.
    // TODO: Retrieve the object from m_tableView or m_arrayController somehow!?!
    // 2) Update the table view selection.
    //[self updateTableViewWithSelectedObjects:...];
}

但是,我无法找到如何识别与前一个选择的最高索引相匹配的对象 为什么?我想将新选择移动到最后一个选择下面的行。


注意:以上代码包含多个错误!

这就是我最终的结果 - 感谢托马斯的澄清。

NSUInteger nextSelectedRowIndex = selectedRowIndices.firstIndex;
if (nextSelectedRowIndex != NSNotFound) {
    if (nextSelectedRowIndex >= m_tableView.numberOfRows) {
        nextSelectedRowIndex = m_tableView.numberOfRows - 1;
    }
    id nextSelection = [[m_arrayController arrangedObjects] objectAtIndex:nextSelectedRowIndex];
    [self updateTableViewWithSelectedObjects:nextSelection]];
}

1 个答案:

答案 0 :(得分:3)

NSIndexSet中的索引是有序的。没有必要循环来找到最高的。

如果要选择给定行,只需使用要建立的新选择调用-selectRowIndexes:byExtendingSelection:。例如,[m_tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:highestSelectedRowIndex] byExtendingSelection:NO]。您不需要知道哪个对象。

如果您仍想知道该对象,则必须获取阵列控制器的arrangedObjects并将-objectAtIndex:应用于该对象。