脚步:
环境:OS X 10.6.4 Xcode 3.2.1
- 创建一个新的“应用程序”项目。
- 打开提供的应用程序委托。
- 添加
NSString *
属性。 - 在
-applicationDidFinishLaunching:
将字符串属性设置为@"/TestString%"
. - 打开笔尖。
- 将
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
内部的字符串,但返回 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。