NSOutlineView outlineViewSelectionDidChange - PullRequest
       8

NSOutlineView outlineViewSelectionDidChange

2 голосов
/ 22 сентября 2011

мой метод NSOutlineView outlineViewSelectionDidChange вызываться не будет.Я установил набор делегата NSOutlineViews в классе, где существуют другие методы, такие как

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

.Но outlineViewSelectionDidChange не будет вызываться при выборе элемента.У кого-нибудь есть идея?

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Хорошо, тем временем я понял, что «NSOutlineViewSelectionDidChangeNotification» будет выброшен только в пределах объекта уведомления.Поэтому мне пришлось создать подкласс моего NSOutlineView, чтобы перехватить уведомление и передать его объекту, где он мне нужен.

1 голос
/ 15 сентября 2015

Ваше собственное представление должно соответствовать протоколу NSOutlineViewDelegate следующим образом.

@interface MyOutlineViewController : NSView <NSOutlineViewDataSource,NSOutlineViewDelegate> {
    IBOutlet NSOutlineView *myoutlineview;
}
@end

у вас будут эти методы в вашей реализации

-(NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item;
-(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item;
-(id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item;
-(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;

где вы настраиваете свой контурный вид. При загрузке этого представления вызывается -(void)viewDidLoad, и ваш предопределенный файл nib / xib или ваш ручной вызов установит ваш источник данных для его заполнения в зависимости от вашей логики.

Теперь в вашем -(void)viewDidLoad ваш myoutlineview должен установить свой собственный делегат с помощью

[myoutlineview setDelegate:self];

так что ваш собственный View может знать, где вызывать его методы уведомлений, вызванные выборами, и так далее. Таким образом, вы можете поместить свою логику уведомлений в тот же класс View, соответствующий этому протоколу.

-(void)outlineViewSelectionDidChange:(NSNotification *)notification {
    NSLog(@"selection did change");
}
0 голосов
/ 22 сентября 2011

Это уведомление немного странно, так как оно не пересылается делегатам автоматически. Попробуйте добавить явную регистрацию в код инициализации, как в следующем примере:

- (void)windowControllerDidLoadNib:(NSWindowController *)aController;
{
    [super windowControllerDidLoadNib:aController];
    NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
    [center addObserver:self
               selector:@selector(outlineViewSelectionDidChange:)
                   name:@"NSOutlineViewSelectionDidChangeNotification"
                 object:outlineView];
}
...