Какой метод я должен вызвать на моем 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;
С пустой реализацией для этих методов (чтобы компилятор не жаловался, и я могу оставить реализацию методов обработки мыши подклассам).