还有其他与此有关的计算器问题,但我提到的解决方案似乎不适用于此问题。我有一个NSTextField,我希望在每次文本更改时都会收到通知。我有一个NSViewController控制包含NSTextField的视图,它将是观察者。在swift中添加通知观察者
我的类简单地看起来是这样的:被添加
import Cocoa
class ADDViewController: NSViewController
{
@IBOutlet weak var fieldText: NSTextField!
func fieldTextChanged(notification: NSNotification)
{
println("fieldTextChanged")
}
override var nibName: String?
{
return "ADDViewController"
}
override func viewDidLoad()
{
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "fieldTextChanged:" as Selector, name: NSControlTextDidChangeNotification, object: fieldText)
}
}
的通知,并射击。当我在字段中输入一个字符时,在堆栈跟踪中看到:
#0 0x00007fff905880e9 in objc_msgSend()
#1 0x00007fff8f27c45c in __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__()
#2 0x00007fff8f16c634 in _CFXNotificationPost()
#3 0x00007fff8fcf0aa1 in -[NSNotificationCenter postNotificationName:object:userInfo:]()
#4 0x00007fff8f27c45c in __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__()
#5 0x00007fff8f16c634 in _CFXNotificationPost()
#6 0x00007fff8fcf0aa1 in -[NSNotificationCenter postNotificationName:object:userInfo:]()
#7 0x00007fff8ab3deb1 in -[NSTextView(NSSharing) didChangeText]()
就在它崩溃之前。我曾尝试将选择器更改为:
@objc func fieldTextChanged(notification: NSNotification)
{
println("fieldTextChanged")
}
但是,当我这样做时,它仍然不起作用。我在控制台中看到的:
2015-08-23 18:36:32.240 addobserver_test[52788:3477511] -[__NSCFString fieldTextChanged:]: unrecognized selector sent to instance 0x6000000c3720
2015-08-23 18:36:32.240 addobserver_test[52788:3477511] An uncaught exception was raised
2015-08-23 18:36:32.240 addobserver_test[52788:3477511] -[__NSCFString fieldTextChanged:]: unrecognized selector sent to instance 0x6000000c3720
2015-08-23 18:36:32.244 addobserver_test[52788:3477511] (
0 CoreFoundation 0x00007fff8f2c003c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff9059576e objc_exception_throw + 43
2 CoreFoundation 0x00007fff8f2c30ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x00007fff8f208e24 ___forwarding___ + 1028
4 CoreFoundation 0x00007fff8f208998 _CF_forwarding_prep_0 + 120
5 CoreFoundation 0x00007fff8f27c45c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
6 CoreFoundation 0x00007fff8f16c634 _CFXNotificationPost + 3140
7 Foundation 0x00007fff8fcf0aa1 -[NSNotificationCenter postNotificationName:object:userInfo:] + 66
8 CoreFoundation 0x00007fff8f27c45c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
9 CoreFoundation 0x00007fff8f16c634 _CFXNotificationPost + 3140
10 Foundation 0x00007fff8fcf0aa1 -[NSNotificationCenter postNotificationName:object:userInfo:] + 66
11 AppKit 0x00007fff8ab3deb1 -[NSTextView(NSSharing) didChangeText] + 348
12 AppKit 0x00007fff8ab3b13b -[NSTextView insertText:replacementRange:] + 2827
13 AppKit 0x00007fff8ab3a237 -[NSTextInputContext(NSInputContext_WithCompletion) insertText:replacementRange:completionHandler:] + 98
14 AppKit 0x00007fff8ab3a1ca __55-[NSTextInputContext handleTSMEvent:completionHandler:]_block_invoke_2242 + 127
15 AppKit 0x00007fff8ab3a12d -[NSTextInputContext do_HandleTSMEvent_insertFixLenTextLoop:whileCondition:dispatchWorkEach:afterEachInsertText:continuation:] + 170
16 AppKit 0x00007fff8b0f653e -[NSTextInputContext tryHandleTSMEvent_insertFixLenText_withContext:dispatchCondition:setupForDispatch:nestedWorkaroundCondition:nestedWorkaroundDispatchWork:loopCondition:dispatchWorkEach:afterEachInsertText:continuation:] + 377
17 AppKit 0x00007fff8ab39b76 __55-[NSTextInputContext handleTSMEvent:completionHandler:]_block_invoke174 + 3779
18 AppKit 0x00007fff8ab38bff -[NSTextInputContext(NSInputContext_WithCompletion) hasMarkedTextWithCompletionHandler:] + 76
19 AppKit 0x00007fff8ab38ba0 __55-[NSTextInputContext handleTSMEvent:completionHandler:]_block_invoke_2 + 95
20 AppKit 0x00007fff8ab38b18 -[NSTextInputContext tryHandleTSMEvent_HasMarkedText_withDispatchCondition:dispatchWork:continuation:] + 101
21 AppKit 0x00007fff8ab387d5 -[NSTextInputContext handleTSMEvent:completionHandler:] + 3122
22 AppKit 0x00007fff8ab37b2e _NSTSMEventHandler + 324
23 HIToolbox 0x00007fff8c691b6c _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1260
24 HIToolbox 0x00007fff8c690fae _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 386
25 HIToolbox 0x00007fff8c690e22 SendEventToEventTargetWithOptions + 43
26 HIToolbox 0x00007fff8c6f526c SendTSMEvent_WithCompletionHandler + 417
27 HIToolbox 0x00007fff8c6f576c __SendUnicodeTextAEToUnicodeDoc_WithCompletionHandler_block_invoke + 400
28 HIToolbox 0x00007fff8c6f55a6 __SendFilterTextEvent_WithCompletionHandler_block_invoke + 189
29 HIToolbox 0x00007fff8c6f52c0 SendTSMEvent_WithCompletionHandler + 501
30 HIToolbox 0x00007fff8c6f508f SendFilterTextEvent_WithCompletionHandler + 236
31 HIToolbox 0x00007fff8c6f4d51 SendUnicodeTextAEToUnicodeDoc_WithCompletionHandler + 295
32 HIToolbox 0x00007fff8c6f4ae9 __utDeliverTSMEvent_WithCompletionHandler_block_invoke_2 + 296
33 HIToolbox 0x00007fff8c6f4988 __utDeliverTSMEvent_WithCompletionHandler_block_invoke + 437
34 HIToolbox 0x00007fff8c6f47cd TSMKeyEvent_WithCompletionHandler + 701
35 HIToolbox 0x00007fff8c6f44d0 __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_4 + 251
36 HIToolbox 0x00007fff8c6f4386 __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_3 + 330
37 HIToolbox 0x00007fff8c6f4112 __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_2 + 259
38 HIToolbox 0x00007fff8c6f3f25 __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke + 251
39 HIToolbox 0x00007fff8c6d876f TSMProcessRawKeyEventWithOptionsAndCompletionHandler + 3068
40 AppKit 0x00007fff8b0fce86 __61-[NSTextInputContext _handleEvent:options:completionHandler:]_block_invoke949 + 131
41 AppKit 0x00007fff8ab36352 -[NSTextInputContext tryTSMProcessRawKeyEvent:dispatchCondition:setupForDispatch:furtherCondition:dispatchWork:continuation:] + 127
42 AppKit 0x00007fff8ab36085 -[NSTextInputContext _handleEvent:options:completionHandler:] + 1266
43 AppKit 0x00007fff8ab35b4e -[NSTextInputContext handleEvent:] + 109
44 AppKit 0x00007fff8ab35a54 -[NSView interpretKeyEvents:] + 207
45 AppKit 0x00007fff8ab3586a -[NSTextView keyDown:] + 695
46 AppKit 0x00007fff8b0250fb -[NSWindow _reallySendEvent:isDelayedEvent:] + 5452
47 AppKit 0x00007fff8a9b6c86 -[NSWindow sendEvent:] + 470
48 AppKit 0x00007fff8a9b38b1 -[NSApplication sendEvent:] + 4199
49 AppKit 0x00007fff8a8dcb68 -[NSApplication run] + 711
50 AppKit 0x00007fff8a859244 NSApplicationMain + 1832
51 addobserver_test 0x00000001000066cd main + 109
52 libdyld.dylib 0x00007fff91e0b5c9 start + 1
53 ??? 0x0000000000000003 0x0 + 3
)
2015-08-23 18:36:32.358 addobserver_test[52788:3477511] -[__NSCFString fieldTextChanged:]: unrecognized selector sent to instance 0x6000000c3720
2015-08-23 18:36:32.358 addobserver_test[52788:3477511] Exception detected while handling key input.
2015-08-23 18:36:32.358 addobserver_test[52788:3477511] -[__NSCFString fieldTextChanged:]: unrecognized selector sent to instance 0x6000000c3720
2015-08-23 18:36:32.361 addobserver_test[52788:3477511] (
0 CoreFoundation 0x00007fff8f2c003c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff9059576e objc_exception_throw + 43
2 CoreFoundation 0x00007fff8f2c30ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x00007fff8f208e24 ___forwarding___ + 1028
4 CoreFoundation 0x00007fff8f208998 _CF_forwarding_prep_0 + 120
5 CoreFoundation 0x00007fff8f27c45c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
6 CoreFoundation 0x00007fff8f16c634 _CFXNotificationPost + 3140
7 Foundation 0x00007fff8fcf0aa1 -[NSNotificationCenter postNotificationName:object:userInfo:] + 66
8 CoreFoundation 0x00007fff8f27c45c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
9 CoreFoundation 0x00007fff8f16c634 _CFXNotificationPost + 3140
10 Foundation 0x00007fff8fcf0aa1 -[NSNotificationCenter postNotificationName:object:userInfo:] + 66
11 AppKit 0x00007fff8ab3deb1 -[NSTextView(NSSharing) didChangeText] + 348
12 AppKit 0x00007fff8ab3b13b -[NSTextView insertText:replacementRange:] + 2827
13 AppKit 0x00007fff8ab3a237 -[NSTextInputContext(NSInputContext_WithCompletion) insertText:replacementRange:completionHandler:] + 98
14 AppKit 0x00007fff8abf8932 -[NSKeyBindingManager(NSKeyBindingManager_MultiClients) flushTextForClient:] + 178
15 AppKit 0x00007fff8b0fd2ef __61-[NSTextInputContext _handleEvent:options:completionHandler:]_block_invoke972 + 460
16 AppKit 0x00007fff8ab38bff -[NSTextInputContext(NSInputContext_WithCompletion) hasMarkedTextWithCompletionHandler:] + 76
17 AppKit 0x00007fff8ab50d03 __61-[NSTextInputContext _handleEvent:options:completionHandler:]_block_invoke_3 + 95
18 AppKit 0x00007fff8ab49ed8 -[NSTextInputContext tryHandleEvent_HasMarkedText_withDispatchCondition:dispatchWork:continuation:] + 101
19 AppKit 0x00007fff8b0fd074 __61-[NSTextInputContext _handleEvent:options:completionHandler:]_block_invoke960 + 321
20 HIToolbox 0x00007fff8c6f8d4f __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_5 + 70
21 HIToolbox 0x00007fff8c6f52c0 SendTSMEvent_WithCompletionHandler + 501
22 HIToolbox 0x00007fff8c6f576c __SendUnicodeTextAEToUnicodeDoc_WithCompletionHandler_block_invoke + 400
23 HIToolbox 0x00007fff8c6f55a6 __SendFilterTextEvent_WithCompletionHandler_block_invoke + 189
24 HIToolbox 0x00007fff8c6f52c0 SendTSMEvent_WithCompletionHandler + 501
25 HIToolbox 0x00007fff8c6f508f SendFilterTextEvent_WithCompletionHandler + 236
26 HIToolbox 0x00007fff8c6f4d51 SendUnicodeTextAEToUnicodeDoc_WithCompletionHandler + 295
27 HIToolbox 0x00007fff8c6f4ae9 __utDeliverTSMEvent_WithCompletionHandler_block_invoke_2 + 296
28 HIToolbox 0x00007fff8c6f4988 __utDeliverTSMEvent_WithCompletionHandler_block_invoke + 437
29 HIToolbox 0x00007fff8c6f47cd TSMKeyEvent_WithCompletionHandler + 701
30 HIToolbox 0x00007fff8c6f44d0 __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_4 + 251
31 HIToolbox 0x00007fff8c6f4386 __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_3 + 330
32 HIToolbox 0x00007fff8c6f4112 __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke_2 + 259
33 HIToolbox 0x00007fff8c6f3f25 __TSMProcessRawKeyEventWithOptionsAndCompletionHandler_block_invoke + 251
34 HIToolbox 0x00007fff8c6d876f TSMProcessRawKeyEventWithOptionsAndCompletionHandler + 3068
35 AppKit 0x00007fff8b0fce86 __61-[NSTextInputContext _handleEvent:options:completionHandler:]_block_invoke949 + 131
36 AppKit 0x00007fff8ab36352 -[NSTextInputContext tryTSMProcessRawKeyEvent:dispatchCondition:setupForDispatch:furtherCondition:dispatchWork:continuation:] + 127
37 AppKit 0x00007fff8ab36085 -[NSTextInputContext _handleEvent:options:completionHandler:] + 1266
38 AppKit 0x00007fff8ab35b4e -[NSTextInputContext handleEvent:] + 109
39 AppKit 0x00007fff8ab35a54 -[NSView interpretKeyEvents:] + 207
40 AppKit 0x00007fff8ab3586a -[NSTextView keyDown:] + 695
41 AppKit 0x00007fff8b0250fb -[NSWindow _reallySendEvent:isDelayedEvent:] + 5452
42 AppKit 0x00007fff8a9b6c86 -[NSWindow sendEvent:] + 470
43 AppKit 0x00007fff8a9b38b1 -[NSApplication sendEvent:] + 4199
44 AppKit 0x00007fff8a8dcb68 -[NSApplication run] + 711
45 AppKit 0x00007fff8a859244 NSApplicationMain + 1832
46 addobserver_test 0x00000001000066cd main + 109
47 libdyld.dylib 0x00007fff91e0b5c9 start + 1
48 ??? 0x0000000000000003 0x0 + 3
)
第一个问题是,我需要@objc在我的选择器前面吗?我不认为这应该是必要的,因为NSViewController是一个NSObject的子类,并且似乎使@objc不必要。它是否正确?
我需要做些什么来完成这项工作?
我有一个样品测试项目为:
https://github.com/ericgorr/addobserver_test
谢谢。