2009-07-08 15 views

cevap

15

Bir şey bulamadığınızda süper sınıflara bakmayı unutmayın. Bu durumda, ihtiyacınız olan yöntemlerden biri, NSOutlineView'ın anlık süper sınıfı olan NSTableView'den gelir.

Çözüm, get the row index for the item using rowForItem: öğesinin üzerindedir ve bu, -1 (öğe görünmez/bulunamadı), create an index set with it with [NSIndexSet indexSetWithIndex:] değilse ve bu dizini the selectRowIndexes:byExtendingSelection: method olarak iletirse.

+0

Merhaba Peter, cevabınız için teşekkürler. SelectRowIndexes: byExtendingSelection yöntemini zaten biliyorum. Sorun, NSOutlineView NSIndexSet ile değil NSIndexPath ile çalışıyor olmasıdır. – cocoafan

+0

NSOutlineView belgelerinde tek bir NSIndexPath örneği görmüyorum. Belki de kullanmadığınız NSTreeController'ı düşünüyorsunuz. Ayrıca, bir anahat görünümü * bir tablo görünümüdür; bu, tüm tablo görünümü işlevselliğinin anahat görünümünde gayet iyi çalışması gerektiği anlamına gelir. –

+0

Evet görüyorum. Kötüye, veri kaynama bağlı olmayan yerleşik bir çözüm yoktur. Veri kaynağımda ekstra kod yazmalıyım, değil mi? – cocoafan

1

Hayır, selectItem: yöntemi yok, ancak bir rowForItem: yöntemi var. Bunu, Peter'ın yukarıdaki selectRowIndexes:byExtendingSelection:'u kullanma tavsiyesiyle birleştirirseniz, ihtiyacınız olan tüm bilgilere sahip olmalısınız. Gerçekten tutarlılık aşkına setSelectedItem: çağıran öneriyoruz bir öğe seçmek için bir yöntem var isteseydi

, sen hiçbir fikri olmadığını sahip 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]; 
} 

üzerinde bir kategoride böyle bir şey yazabilirsiniz Bu kod aslında çalışır; Sadece kavramı açıklamak için attı.

+0

Tavsiyeleriniz için ikinize de teşekkürler. – cocoafan

18

Sonunda nasıl sonuçlandım. Öneriler ve düzeltmeler her zaman beklerim.

@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 
+2

Bu yöntemler için teşekkürler. İnanılmazlar! Benim düşünceme göre, bu cevap önceden kabul edilmiş olandan daha eksiksiz ve ayrıntılı. –

0

PXSourceList öğesinde bir öğeyi program aracılığıyla seçmek için kullandığım kod snippet'i.

sourceList normal bir PXSouceList nesnesidir ve anahattın ilk grubundaki ikinci öğeyi seçmek istedim.

Henüz bilmiyorsanız

NSInteger itemRow = [sourceList rowForItem:[[(SourceListItem *)[sourceListItems objectAtIndex:0] children] objectAtIndex:1]]; 
    [sourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:itemRow] byExtendingSelection:YES]; 

, PXSourceList sen/posta stil özetliyor itunes arıyoruz eğer bir NSOutlineView için mükemmel bir yerine geçer. Buradan alın: PxSourceList