1

のサブクラスを使用してNSPersistentDocumentデータを保存する OS X アプリケーションがあります。Core Data の永続ストア タイプは SQLite です。Xcode でコア データを使用してドキュメント ベースのアプリケーションの新しいプロジェクトを作成するときに作成される標準のメニュー コマンドに依存しています。

このアプリケーションは約 2 年前から存在し、常に進化しています。ちょうど今日、私の最新バージョンで「名前を付けて保存」が機能しないことを発見しました。動作は次のとおりです。

  • 新しいドキュメントを作成し、いくつかのデータを入力します。
  • ドキュメントを保存して閉じ、再度開きます。すべて順調。次に、[名前を付けて保存] を選択し、ファイルの新しい名前と場所を選択します。名前が変更され、さらにデータを入力できます。
  • ドキュメントを保存して閉じ、再度開くと、完全に空です。
  • 元のドキュメントを開くと、名前を付けて保存したドキュメントにあるはずのすべての変更がそこにあります。
  • アプリケーションがクラッシュしたり、エラーが発生したりすることはありません。

かつては正しく機能していたと確信しています。プログラムの最初の「公式」バージョンを試しましたが、動作は同じです (間違っています)。

編集: Core Data エンティティを 1 つだけ使用して、同じタイプの新しい Xcode プロジェクトを作成しました。動作は同じです。私のアプリケーションとの唯一の違いは、新しいプロジェクトが「名前を付けて保存」ではなく、10.7 Lion で導入された新しい「複製」メニュー コマンドを自動的に使用したことです。そのため、オプション キーを押して [名前を付けて保存] を選択する必要があります。

10.9.3 でのみテストしましたが、2 つの異なる Mac でテストしました。誰がどこを見ればいいのか考えていますか?

編集 2:特定のアカウント (2 台のマシン上の私のアカウント) に関連しているようです。別のアカウントで正しく動作します。

4

3 に答える 3

0

Felix Franz がcocoa-dev メーリング リストに投稿したことで、正しい方向に進むことができました。この問題は、特定の ACL 設定に関連しています。NSPersistentDocumentクラスに次のコードを追加してオーバーライドしましたwriteToURL:ofType:forSaveOperation:originalContentsURL:error:

- (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError *__autoreleasing *)error {
    if ((saveOperation == NSSaveAsOperation)  && (absoluteOriginalContentsURL == nil)) {
        NSLog(@"---------- absoluteOriginalContentsURL == nil for NSSaveAsOperation ------------");
        return [super writeToURL:absoluteURL ofType:typeName forSaveOperation:saveOperation originalContentsURL:self.fileURL error:error];
    }
    return [super writeToURL:absoluteURL ofType:typeName forSaveOperation:saveOperation originalContentsURL:absoluteOriginalContentsURL error:error];
}

何らかの理由で nil のself.fileURLときにスーパー メソッドに提供されることは明らかです。absoluteOriginalContentsURLテストしたすべてのアカウントで「名前を付けて保存」が機能するようになりました。

于 2014-06-25T19:40:39.713 に答える