Доступ к сенсорным событиям в глобальном мониторе приводит к ошибке - PullRequest
0 голосов
/ 17 ноября 2018

Я пишу приложение 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 Ответ

0 голосов
/ 20 ноября 2018

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

...