2

手順:

環境: 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内部的に変換しようとして失敗し、例外をトリガーする 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.

4

0 に答える 0