2012-04-10 17 views
0

"Qref"という名前のアドレス帳にカスタムプロパティを作成しました。私はそれが[ABPerson properties]を使用していることを確認することができます、そして、それは私が書いたテストアプリのために常にそこにあります。AddressBookのカスタムプロパティに設定した値を保持するにはどうしたらいいですか?

ところで、[ABPerson removeProperties]は実装されていないため、カスタムプロパティを削除することはできません。名前が間違っている名前を削除する必要があるので、それが今のところあるかどうかを教えてください。

このコードでプロパティ値を設定しました。私は離れてPeoplePicker者から移動し、正しく値を見つけるために返すことができます。この時点で、

ABPerson *p = <person chosen from a PeoplePicker>; 
NSError *e; 
if (![p setValue: aString forProperty:@"Qref" error:&e]) { 
    [NSAlert alertWithError:e]runModal; 
} 

(私はまだ警告を見ていないが、時にはコンソールでエラーメッセージのヒープを取得したことがない。) セット。 私は[[ABAddressBook sharedAddressBook] hasUnsavedChanges]をチェックすると結果がNO、そうはっきりと変化するカスタムプロパティの値が変更としてカウントされませんので、私はその後、

[[ABAddressBook sharedAddressBook] save]; 
を実行し、(より良い方法を提案してください)ダミー人を挿入することで、保存を強制されます

ダミーの人物は、実行中の場合はすぐにAddressBookに表示されるので、何かが正しいです。しかし、私は私のアプリを閉じて再び実行すると、私は設定した値がなくなったことがわかります。 (MacOSX-Lion)

答えて

1

私は間違った木を吠えています。それは、彼らがカスタムであるかどうかにかかわらず、私は任意のプロパティを保存することができなかったことが判明した。それから、私がコード署名、エンタイトルメント、またはiCloud(私には不可侵のジャングル)と関係があるのか​​どうか疑問に思った。 PeoplePickerから取得した人物がアドレス帳に関連付けられていないようだから、[[ABAddressBook sharedAddressBook] save]は何もしません。 ABAddressBookインスタンスからあなたの人を取得する必要があります。エラーチェックを行わずに、動作するスケルトンを次に示します。

ABPerson *p = [[myPeoplePicker selectedRecords] objectAtIndex:0]; 
NSString *uid = p.uniqueId; 
ABPerson *editablePerson = 
    (ABPerson*) [[ABAddressBook sharedAddressBook] recordForUniqueId:uid]; 
// Typecast because it returns an ABRecord. Can anyone improve? 
[editablePerson setValue:@"ABCD" forProperty:@"Qref"]; // my custom property 
[[ABAddressBook sharedAddressBook] save]; 
+0

あなたは命を救っています! ABPerson、ABPersonView、およびMac OS X上のABAddressBookには、まだウェブ上に文書化されていない隠された問題点がたくさんあります。私は誰もこの新しい10.7クラスを使っていないと思っていました。 – Byron

+0

私はLionで利用可能な新しいアドレス帳のクラスを指しています。 – Byron

関連する問題