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

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

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

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

РЕДАКТИРОВАТЬ:
Перечитывая документы, я думаю, что должен позвонить в NSCell's -trackMouse:inRect:ofView:untilMouseUp: и переопределить -startTrackingAt:inView:, -continueTracking:at:inView: а также -stopTracking:at:inView:mouseIsUp:, Снова два вопроса: 1) документы создают впечатление, что они вызываются только тогда, когда мышь нажата. Это верно? Тогда что мне делать вместо этого? 2) Где и когда я должен позвонить в NSCell -trackMouse:inRect:ofView:untilMouseUp:?

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;

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

Другие вопросы по тегам