2

脚步:

环境:OS X 10.6.4 Xcode 3.2.1

  1. 创建一个新的“应用程序”项目。
  2. 打开提供的应用程序委托。
  3. 添加NSString *属性。
  4. -applicationDidFinishLaunching:将字符串属性设置为@"/TestString%".
  5. 打开笔尖。
  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内部的字符串,但返回 nil 失败,从而触发了异常。如果您在字符串中省略前导 / 您会看到以下消息,这一事实进一步强化了这一点:

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 的属性的 getter,以使用-stringByAddingPercentEscapesUsingEncoding:and返回转义字符串NSUTF8StringEncoding


由于没有人提出任何意见,因此我继续向 Apple 提交了此文件。rdar://8452431。

4

0 回答 0