Является ли факт, что NSPathControl не экранирует символы процента ('%') при привязке к строке, ошибкой? - PullRequest
2 голосов
/ 16 сентября 2010

Шаги:

Окружающая среда: OS X 10.6.4 Xcode 3.2.1

  1. Создайте новый проект «Приложение».
  2. Откройте предоставленный делегат приложения.
  3. Добавить NSString * свойство.
  4. В -applicationDidFinishLaunching: установить для свойства строки значение @"/TestString%".
  5. Откройте NIB.
  6. Перетащите NSPathControl в окно приложения.
  7. Привязать привязку значения NSPathControl к свойству, созданному на шаге 3.
  8. Запустите приложение
  9. Просмотр консоли.

Вы должны увидеть следующее утверждение, и элемент управления пути не будет отображаться:

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.

...