Какой метод я должен вызвать на моем NSCell

Я пишу собственный NSControl с пользовательскими NSCells. Это элемент управления, поэтому он должен реагировать на мышь. Я создал NSTrackingArea над своим элементом управления, реализовал -mouseEntered:, -mouseExited: и -mouseMoved:. (И мне придется реализовать -mouseUp/Down:, но я понятия не имею, что там делать, поэтому пока я еще не переопределил эти методы.) В этих методах я успешно определяю, в какой ячейке в данный момент находится мышь. Теперь у меня два вопроса:

  • Это хороший подход для отслеживания мыши? Если нет, что мне делать вместо этого?
  • Какой метод я должен вызывать на своем NSCell при щелчке мыши, когда мышь входит в ячейку, когда мышь покидает ячейку и т. д.? Документы Apple не очень ясны по этому поводу.

Итак, по сути: Когда я должен вызывать какой метод на моем NSCell, чтобы он реагировал на события мыши?

EDIT:
Перечитывая документы, я думаю, что мне следует позвонить NSCell -trackMouse:inRect:ofView:untilMouseUp: и переопределить -startTrackingAt:inView:, -continueTracking:at:inView: и -stopTracking:at:inView:mouseIsUp:. Снова два вопроса: 1) документы создают впечатление, что они вызываются только тогда, когда мышь не работает. Это правильно? Тогда что мне делать вместо этого? 2) Где/когда я должен позвонить в NSCell -trackMouse:inRect:ofView:untilMouseUp:?


person 11684    schedule 14.03.2013    source источник
comment
Взгляните на NSActionCell; это должно дать вам образец, которому вы хотите следовать.   -  person Jim Puls    schedule 14.03.2013
comment
Не могли бы вы рассказать об этом более детально? Я также хочу добавить подсветку, поэтому мне нужно нечто большее, чем просто поддержка цели/действия. @JimPuls   -  person 11684    schedule 14.03.2013


Ответы (1)


В итоге я реализовал свой собственный механизм отслеживания мыши:

// MyControl.m:

- (void)mouseDown:(NSEvent *)theEvent {
    int currentCellIndex = [self indexOfCellAtPoint:[self convertPoint:[theEvent locationInWindow] fromView:nil]];
    if (currentCellIndex < [cells count]) {
        MKListCell *cell = [cells objectAtIndex:currentCellIndex];
        currentCell = cell;
        [currentCell mouseDown:theEvent];
    }
}

- (void)mouseUp:(NSEvent *)theEvent {
    int currentCellIndex = [self indexOfCellAtPoint:[self convertPoint:[theEvent locationInWindow] fromView:nil]];
    if (currentCellIndex < [cells count]) {
        MKListCell *cell = [cells objectAtIndex:currentCellIndex];
        [cell mouseUp:theEvent];
    }
}

- (void)mouseEntered:(NSEvent *)theEvent {
    int currentCellIndex = [self indexOfCellAtPoint:[self convertPoint:[theEvent locationInWindow] fromView:nil]];
    if (currentCellIndex < [cells count]) {
        MKListCell *cell = [cells objectAtIndex:currentCellIndex];
        currentCell = cell;
        [currentCell mouseEntered:theEvent];
    }
}

- (void)mouseExited:(NSEvent *)theEvent {
    int currentCellIndex = [self indexOfCellAtPoint:[self convertPoint:[theEvent locationInWindow] fromView:nil]];
    if (currentCellIndex < [cells count]) {
        MKListCell *cell = [cells objectAtIndex:currentCellIndex];
        [cell mouseExited:theEvent];
        currentCell = nil;
    }
}

- (void)mouseMoved:(NSEvent *)theEvent {
    int currentCellIndex = [self indexOfCellAtPoint:[self convertPoint:[theEvent locationInWindow] fromView:nil]];
    MKListCell *cell;
    if (currentCellIndex < [cells count]) {
        cell = [cells objectAtIndex:currentCellIndex];
    }
    if (currentCell != cell) {
        [currentCell mouseExited:theEvent];
        [cell mouseEntered:theEvent];
        currentCell = cell;
    }
    else {
        [currentCell mouseMoved:theEvent];
    }
}

- (void)mouseDragged:(NSEvent *)theEvent {
    int currentCellIndex = [self indexOfCellAtPoint:[self convertPoint:[theEvent locationInWindow] fromView:nil]];
    MKListCell *cell = nil;
    if (currentCellIndex < [cells count]) {
        cell = [cells objectAtIndex:currentCellIndex];
    }
    if (currentCell != cell) {
        [currentCell mouseExited:theEvent];
        [cell mouseEntered:theEvent];
        currentCell = cell;
    }
    else {
        [currentCell mouseMoved:theEvent];
    }   
}

- (int)indexOfCellAtPoint:(NSPoint)p {
    int cellIndex = (self.bounds.size.height - p.y) / cellHeight;
    return cellIndex;
}

И, конечно же, в MyCell.h:

- (void)mouseDown:(NSEvent *)event;
- (void)mouseUp:(NSEvent *)event;
- (void)mouseMoved:(NSEvent *)event;
- (void)mouseEntered:(NSEvent *)event;
- (void)mouseExited:(NSEvent *)event;

С пустой реализацией этих методов (поэтому компилятор не жалуется, и я могу оставить реализацию методов обработки мыши подклассам).

person 11684    schedule 31.03.2013