I'm using NSOutlineView
without NSTreeController
and have implemented my own datasource. What is the best way to select an item?
NSOutlineView
support already expandItem:
and collapseItem:
. And I'm missing a handy method like `selectItem:. How can I do it programatically ?
Thank you.
Here is how I finally ended up. Suggestions and corrections are always welcome.
@implementation NSOutlineView (Additions)
- (void)expandParentsOfItem:(id)item {
while (item != nil) {
id parent = [self parentForItem: item];
if (![self isExpandable: parent])
break;
if (![self isItemExpanded: parent])
[self expandItem: parent];
item = parent;
}
}
- (void)selectItem:(id)item {
NSInteger itemIndex = [self rowForItem:item];
if (itemIndex < 0) {
[self expandParentsOfItem: item];
itemIndex = [self rowForItem:item];
if (itemIndex < 0)
return;
}
[self selectRowIndexes: [NSIndexSet indexSetWithIndex: itemIndex] byExtendingSelection: NO];
}
@end
Remember to look in superclasses when you can't find something. In this case, one of the methods you need comes from NSTableView, which is NSOutlineView's immediate superclass.
The solution is to get the row index for the item using rowForItem:
, and if it isn't -1 (item not visible/not found), create an index set with it with [NSIndexSet indexSetWithIndex:]
and pass that index set to the selectRowIndexes:byExtendingSelection:
method.
No, there isn't a selectItem:
method, but there is an rowForItem:
method. If you combine that with Peter's advice about using selectRowIndexes:byExtendingSelection:
above, you should have all the information you need.
If you really wanted to have a method to select an item, which I would recommend calling setSelectedItem:
for consistency's sake, you could write something like this in a category on NSOutlineView
- (void)setSelectedItem:(id)item {
NSInteger itemIndex = [self rowForItem:item];
if (itemIndex < 0) {
// You need to decide what happens if the item doesn't exist
return;
}
[self selectRowIndexes:[NSIndexSet indexSetWithIndex:itemIndex] byExtendingSelection:NO];
}
I have no idea if this code actually works; I just dashed it off to illustrate the concept.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With