Доступ к сенсорным событиям в глобальном мониторе приводит к ошибке
Я пишу приложение MacOs, в котором я пытаюсь получить положение касания в трекпаде. Например, левый нижний угол будет 0,0, а верхний правый - 100,100.
Я хочу получить эту информацию для касаний, которые происходят из моего приложения, поэтому я использую глобальный монитор.
Я нашел некоторую информацию и прочитал официальную документацию (с внушительным отсутствием примеров), но я все еще могу заставить это работать. Я получаю сообщение об ошибке каждый раз, когда пытаюсь получить доступ к методу allTouches()
с места событий. Вот код:
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
NSEvent.addGlobalMonitorForEvents(matching: NSEvent.EventTypeMask.leftMouseDown) {event in
let touch = event.allTouches()
}
}
}
Я получаю следующую ошибку:
2018-11-17 12:49:08.693873+0000 App[76030:1935325] [default] Unable to load Info.plist exceptions (eGPUOverrides)
2018-11-17 12:49:09.910842+0000 App[76030:1935325] *** Assertion failure in -[NSEvent touchesMatchingPhase:inView:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1671/AppKit.subproj/NSEvent.m:4752
2018-11-17 12:49:09.910996+0000 App[76030:1935325] [General] An uncaught exception was raised
2018-11-17 12:49:09.911019+0000 App[76030:1935325] [General] Invalid message sent to event "NSEvent: type=LMouseDown loc=(760.789,273.406) time=414257.3 flags=0 win=0x0 winNum=42380 ctxt=0x0 evNum=30352 click=1 buttonNumber=0 pressure=1 deviceID:0x200000001000000 subtype=NSEventSubtypeTouch"
2018-11-17 12:49:09.913059+0000 App[76030:1935325] [General] (
0 CoreFoundation 0x00007fff32b6943d __exceptionPreprocess + 256
1 libobjc.A.dylib 0x00007fff5ea76720 objc_exception_throw + 48
2 CoreFoundation 0x00007fff32b8408e +[NSException raise:format:arguments:] + 98
3 Foundation 0x00007fff34f2055d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 194
4 AppKit 0x00007fff303e3cd2 -[NSEvent touchesMatchingPhase:inView:] + 494
5 App 0x00000001000018a2 _T07App14ViewControllerC11viewDidLoadyyFySo7NSEventCcfU_ + 34
6 App 0x0000000100001c4e _T0So7NSEventCIxx_ABIyBy_TR + 62
7 AppKit 0x00007fff3063f2b5 GlobalObserverHandler + 117
8 HIToolbox 0x00007fff31d468d9 _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1502
9 HIToolbox 0x00007fff31d45c16 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 371
10 HIToolbox 0x00007fff31d45a9c SendEventToEventTargetWithOptions + 45
11 HIToolbox 0x00007fff31d62c54 _ZL29ToolboxEventDispatcherHandlerP25OpaqueEventHandlerCallRefP14OpaqueEventRefPv + 1336
12 HIToolbox 0x00007fff31d46d0c _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 2577
13 HIToolbox 0x00007fff31d45c16 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 371
14 HIToolbox 0x00007fff31d631cd SendEventToEventTarget + 39
15 AppKit 0x00007fff30005b36 _DPSNextEvent + 1472
16 AppKit 0x00007fff300046fa -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1362
17 AppKit 0x00007fff2fffe75d -[NSApplication run] + 699
18 AppKit 0x00007fff2ffede97 NSApplicationMain + 780
19 App 0x00000001000039ed main + 13
20 libdyld.dylib 0x00007fff5fb44085 start + 1
)
Что я делаю не так и как мне это исправить?
1 ответ
allTouches
недопустимо для событий нажатия мыши, только из событий NSEventTypeGesture, как отмечено в комментарии в заголовочном файле:
/* Only valid for NSEventTypeGesture events. Equivalent to [event
touchesMatchingPhase:NSTouchPhaseAny inView:nil] */
- (NSSet <NSTouch *> *)allTouches NS_AVAILABLE_MAC(10_12);
Для NSEvent.EventTypeMask.leftMouseDown
Вы просите, чтобы вас уведомили о следующих основных свойствах, к которым вы, вероятно, захотите получить доступ:
/* these messages are valid for all mouse down/up/drag events */
@property (readonly) NSInteger clickCount;
@property (readonly) NSInteger buttonNumber; // for NSOtherMouse events, but will return valid constants for NSLeftMouse and NSRightMouse
…
/* -pressure is valid for all mouse down/up/drag events, and is also valid for NSEventTypeTabletPoint events on 10.4 or later and NSEventTypePressure on 10.10.3 or later */
@property (readonly) float pressure;
/* -locationInWindow is valid for all mouse-related events */
@property (readonly) NSPoint locationInWindow;
Если вы на самом деле пытаетесь получить жесты, используйте NSEventTypeGesture
маска. Тогда вы можете использовать allTouches
а также touchesForView
, Обратите внимание, что вам может потребоваться различать события, связанные с прокруткой жестов, и другие жесты, в зависимости от вашей ситуации и целей.