シナリオは、アドレス帳を呼び出したいビューが複数あるというものです。各ビューでデリゲートのコードを複製しないように、アプリ デリゲートのヘッダーと .m ファイルにコードを配置しましたが、2 つのそれぞれのアプリの下部にある「@interface AddressBookDelegate」と「@implementation AddressBookDelegate」を使用します。デリゲート・フィエ-
@interface AddressBookDelegate : UIViewController <ABPeoplePickerNavigationControllerDelegate> {
AddressBookDelegate *addressBookDelegate;
}
@property (nonatomic, retain) AddressBookDelegate *addressBookDelegate;
@end
と
@implementation AddressBookDelegate
@synthesize addressBookDelegate;
- (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker
{
[self dismissModalViewControllerAnimated:YES];
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
[super dismissModalViewControllerAnimated:YES];
...get stuff from the Address Book...
return NO;
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
return NO;
}
次に、私の見解では、次のコードがあります。
addressBookDelegate = (AddressBookDelegate *) [[UIApplication sharedApplication] delegate];
ABPeoplePickerNavigationController *abPicker = [[ABPeoplePickerNavigationController alloc]init];
abPicker.peoplePickerDelegate = self.addressBookDelegate;
[self presentModalViewController:abPicker animated:YES];
[abPicker release];
アドレス帳はすべてのビューで正常に表示されます。しかし、アドレス帳の [キャンセル] ボタンなど、デリゲートを呼び出すユーザー アクションを実行すると、クラッシュします。
-[MyprogAppDelegate peoplePickerNavigationControllerDidCancel:]: 認識されないセレクターがインスタンスに送信されました
警告なしでクリーンにコンパイルされます。
ビュー自体と物理的に同じファイルにない場合、アドレス デリゲート コードに接続するために peoplePickerDelegate を接続するにはどうすればよいですか? どうも。
追記: デバッガーを使用して途中で停止した場合
abPicker.peoplePickerDelegate = addressBookDelegate;
ビューのコードでは、addressBookDelegate のアドレスが、予想していた AddressBookDelegate ではなく、MyprogAppDelegate のアドレスであると記述されていることがわかります。これは、App Delegate ファイル内で、アドレス帳のデリゲート コードへの置換がオフになっていると思わせます。
AddressBookDelegate Cancel Delegate コードが AddressBookDelegate に 1000 バイトあるとすれば、私のアプリは実際には 1000 バイトのコードを MyprogAppDelegate に「入力」しているため、クラッシュします。そのため、どういうわけか、AddressBookDelegate のアドレス指定を正しく設定していません。とにかくそれは私の考えです...