手順:
環境: 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
内部的に変換しようとして失敗し、例外をトリガーする 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 にバインドされたプロパティのゲッターを手動で実装して、 and を使用してエスケープされた文字列を返すことでし-stringByAddingPercentEscapesUsingEncoding:
たNSUTF8StringEncoding
。
誰も何も意見を持っていなかったので、私は先に進んでこれをAppleに提出しました. rdar://8452431.