NSTextField должен удваиваться в Swift, как разрешить пустое? - PullRequest
0 голосов
/ 09 марта 2019

Я использую NSTextField, который я связал с целым числом через привязку в раскадровке. Код Swift выглядит так:

@objc dynamic var quantity: Int = 0

Это прекрасно работает для проверки чисел, и я получаю полезное сообщение, если пытаюсь ввести что-то недопустимое, например, буквы алфавита.

Проблема, с которой я столкнулся, заключается в том, что приложение вылетает, когда вы выходите из поля, не заполняя ничего. После сообщений об ошибках наиболее релевантным представляется:

2019-03-09 16:29:46.813928+0000 ViewWebSocketLearning[34535:1969855] [General] [<ViewWebSocketLearning.OrderFormViewController 0x103131820> setNilValueForKey]: could not set nil as the value for the key show.
2019-03-09 16:29:46.825146+0000 ViewWebSocketLearning[34535:1969855] [General] (
    0   CoreFoundation                      0x00007fff3d7b6ded __exceptionPreprocess + 256
    1   libobjc.A.dylib                     0x00007fff69882720 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff3d7b6c1f +[NSException raise:format:] + 201
    3   Foundation                          0x00007fff3fbe8dbb -[NSObject(NSKeyValueCoding) setNilValueForKey:] + 81
    4   Foundation                          0x00007fff3fac1450 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 331
    5   Foundation                          0x00007fff3faec38a -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 271
    6   AppKit                              0x00007fff3af0bf03 -[NSBinder _setValue:forKeyPath:ofObject:mode:validateImmediately:raisesForNotApplicableKeys:error:] + 473
    7   AppKit                              0x00007fff3af0bccf -[NSBinder setValue:forBinding:error:] + 236
    8   AppKit                              0x00007fff3b54c376 -[NSValueBinder _applyObjectValue:forBinding:canRecoverFromErrors:handleErrors:typeOfAlert:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:] + 225
    9   AppKit                              0x00007fff3b54c698 -[NSValueBinder applyDisplayedValueHandleErrors:typeOfAlert:canRecoverFromErrors:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:error:] + 544
    10  AppKit                              0x00007fff3b54c81a -[NSValueBinder _applyDisplayedValueIfHasUncommittedChangesWithHandleErrors:typeOfAlert:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:error:] + 105
    11  AppKit                              0x00007fff3b053e4e -[NSValueBinder validateAndCommitValueInEditor:editingIsEnding:errorUserInterfaceHandled:] + 460
    12  AppKit                              0x00007fff3b053c5a -[_NSBindingAdaptor _validateAndCommitValueInEditor:editingIsEnding:errorUserInterfaceHandled:bindingAdaptor:] + 175
    13  AppKit                              0x00007fff3b053b8d -[_NSBindingAdaptor validateAndCommitValueInEditor:editingIsEnding:errorUserInterfaceHandled:] + 240
    14  AppKit                              0x00007fff3af83e2b -[NSTextField textShouldEndEditing:] + 368
    15  AppKit                              0x00007fff3af44cc9 -[NSTextView(NSSharing) resignFirstResponder] + 499
    16  AppKit                              0x00007fff3ada2522 -[NSWindow _realMakeFirstResponder:] + 258
    17  AppKit                              0x00007fff3b058001 -[NSTextView(NSPrivate) _giveUpFirstResponder:] + 263

Я интерпретирую это как привязку NSTextField, не принимающую нулевую запись, по-видимому, вызванную оставлением поля пустым.

Как я могу предотвратить возникновение этого исключения? Для моего приложения вполне нормально оставить поле пустым, работая над чем-то другим.

1 Ответ

1 голос
/ 10 марта 2019

Используя NSTextFields с привязками, Какао использует методы кодирования значения ключа (KVC), такие как setValue:forKey: Настройка привязок в Storyboard / XIB всегда привязана к объекту подкласса NSObject (контроллеру). Необъектные значения обрабатываются специально:

Если ваш объект, совместимый со значением ключа, получает setValue:forKey: сообщение с nil, переданным в качестве значения для свойства не-объекта, Реализация по умолчанию не имеет соответствующего, обобщенного курса действие. Поэтому он отправляет себе setNilValueForKey: сообщение, которое Вы можете переопределить. Реализация по умолчанию setNilValueForKey: вызывает исключение NSInvalidArgumentException, но вы можете предоставить соответствующее, специфичное для реализации поведение.

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueCoding/HandlingNon-ObjectValues.html#//apple_ref/doc/uid/10000107i-CH5-SW1

В вашем случае OrderFormViewController не было переопределено setNilValueForKey: метод, и это вызвало исключение.

Реализация setNilValueForKey: решит все проблемы.

PS: использование NSNumberFormatter или привязка к объекту NSNumber также решит проблему.

...