Шаги:
Окружающая среда:
OS X 10.6.4
Xcode 3.2.1
- Создайте новый проект «Приложение».
- Откройте предоставленный делегат приложения.
- Добавить
NSString *
свойство.
- В
-applicationDidFinishLaunching:
установить для свойства строки значение @"/TestString%"
.
- Откройте NIB.
- Перетащите
NSPathControl
в окно приложения.
- Привязать привязку значения
NSPathControl
к свойству, созданному на шаге 3.
- Запустите приложение
- Просмотр консоли.
Вы должны увидеть следующее утверждение, и элемент управления пути не будет отображаться:
2010-09-15 13:23:39.043 NSPathControlPercentString[83066:a0f] *** Assertion failure in -[NSPathComponentCell _objectValue:forString:errorDescription:], /SourceCache/AppKit/AppKit-1038.32/AppKit.subproj/NSCell.m:1531
2010-09-15 15:33:04.193 NSPathControlPercentString[84028:a0f] Invalid parameter not satisfying: aString != nil
Если вы удалите знак процента из строки в шаге 4, утверждение исчезнет, и элемент управления пути будет отображаться правильно.
Я пробовал следующие символы, и ни один из них не вызывает одну и ту же проблему (не используйте двойные кавычки и обратную косую черту):
!@#$^&*()_-+=:;'|"\?.,<>~`
После некоторой отладки я отследил это до метода, поддерживающего процентные экранирования. например если вы используете строку @"/Test%20string"
, в результате отобразится «Тестовая строка», преобразующая% 20 в пробел.
Я нигде не обнаружил такого поведения. Я скучаю по нему?
Я столкнулся с этой проблемой, потому что я использовал -[NSBrowser path]
для зеркального отображения пути браузера на NSPathControl
. Если бы содержимое выбранной ячейки браузера содержало знак%, весь NSPathControl
потерпел бы неудачу (QA отлично подходит для появления подобных вещей - большое спасибо им).
Мое лучшее предположение состоит в том, что он пытается преобразовать строку в NSURL
внутренне, которая не возвращает ноль, что вызывает исключение. Это подтверждается тем фактом, что если вы пропустите начальную / строку, вы увидите следующее сообщение:
2010-09-15 15:35:55.543 NSPathControlPercentString[84100:a0f] *** -[NSURL initWithScheme:host:path:]: path test!@#$^&*()_-+=:;'|"\?.,<>~` is not absolute.
Но это все еще чего-то не хватает, потому что -initWithScheme:host:path:
задокументировано как добавление необходимых прецедентных выходов, а те методы, которые могут вызывать -initWithScheme:host:path:
и не документированы как добавление экранирований (например, -initWithString
), задокументированы как требующие экранируется для символов, которые не вызывают проблем, а именно :
, /
, #
, ;
и @
.
Я планирую сообщить об ошибке в Apple об этом, но я хотел где-нибудь это зафиксировать и убедиться, что я что-то не пропустил первым.
Для всех, кто нашел этот вопрос в поисках решения, мое решение состояло в том, чтобы вручную реализовать метод получения свойства, связанного с NSPathControl, для возврата экранированной строки, используя -stringByAddingPercentEscapesUsingEncoding:
и NSUTF8StringEncoding
.
Так как никто не имел никакого ввода, я отправил это в Apple. rdar: //8452431.