2011-12-02 5 views
0

私は、アドレス帳を呼び出す複数のビューを持っているというシナリオです。したがって、各ビューでデリゲートのコードを複製しないように、私はApp Delegateのヘッダーと.mファイルにコードを配置しましたが、2つのアプリケーションの下部に「@interface AddressBookDelegate」と「@implementation AddressBookDelegate」を使用しています書籍はすべてのビューで細かい表示peoplePickerDelegateがデリゲート権限のアドレスを取得できないのはなぜですか?

addressBookDelegate = (AddressBookDelegate *) [[UIApplication sharedApplication] delegate]; 

ABPeoplePickerNavigationController *abPicker = [[ABPeoplePickerNavigationController alloc]init];  
abPicker.peoplePickerDelegate = self.addressBookDelegate; 
[self presentModalViewController:abPicker animated:YES]; 
[abPicker release]; 

住所:委任fiies-

@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; 
} 

はその後、私の見解では、私は次のコードを持っています。私は、デリゲートを呼び出します任意のユーザーの行動を取るときには、アドレス帳のキャンセルボタンのように、私は

をcrash- - [MyprogAppDelegate peoplePickerNavigationControllerDidCancel:]:認識されていないセレクタはインスタンスに

を送ったそれはきれいにコンパイル、警告なし。

peoplePickerDelegateを物理的にビュー自体と同じファイルにないときに、アドレス代理コードに接続するにはどうすればよいですか?どうも。

注意事項を追加しました:私は、デバッガを使用してビューのコードで

abPicker.peoplePickerDelegate = addressBookDelegate; 

ライン上に停止したときに、私のようにAddressBookDelegateない、addressBookDelegateのためのアドレスはMyprogAppDelegateのアドレスであると記載されていることがわかり期待したかもしれない。それで、私は、アドレス帳代理コードへの置き換えがApp Delegateファイル内でオフになっていると思います。

AddressBookDelegate Cancel DelegateコードがAddressBookDelegateに1000バイトであると、私のアプリは実際にはMyprogAppDelegateにコード1000バイトを "入力"しているのでクラッシュします。だから何とか私はAddressBookDelegateのアドレス指定を正しく設定していません。それはとにかくそれが私の感想です...

答えて

0

最後に:今

は、機能を実装します。私は時間を削減して移動しなければならなかったので、各ビューでコードを複製しました。私はこれをやって終わったよりもオブジェクトベースの方法でやり遂げることができると確信しているので、もう一度これを見直します。

1

あなたのコードは、あなたのappdelegate(MyprogAppDelegateは)メソッドpeoplePickerNavigationControllerDidCancelを実装していることを前提としています。

ので、MyprogAppDelegateであなたのコードは次のようなものでなければなりません:

@implementation MyprogAppDelegate 
@synthesize ...; 

#pragma mark - 
#pragma mark Application lifecycle 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  


    return YES; 
} 

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{ 

} 
+0

それはそれを持って、申し訳ありませんが、私はそれが明らかになったと想定。私は質問にそれを加えました。だから、App Delegateにある人々ピッカーの委任コードがそこにあります。それに取り組んで、私がそれに対処するのに間違った何かがあります。 Plsは何かを明確にするために質問の最後に追加されたテキストを書き留めます。 – Ric

0

EDITさて、全体の最初の答えは出て投げてきました。これは、いくつかの警告で、まだ暗闇の中で少しのショットですが、私はそれが役に立つと近づくと思っています。しかし、アイデアのいくつかは引き継ぎます。

  1. あなたは非常におそらくあなたABPeoplePickerNavigationControllerDelegateとして動作するように別のクラスを必要としません。おそらく、それは下部にあなたのコードを持っているのと同じクラスでなければなりません(それはpresentModalViewController:animated:を呼び出します)。私はコントローラが何であるかわからないので、私は参考のためにMyViewControllerと呼ぶつもりです。デリゲートメソッドでは、アドレス帳を持つモーダルビューコントローラを閉じることができる必要があるためです。

  2. あなたは間違いあなたのプログラムのUIApplicationDelegateABPeoplePickerNavigationControllerDelegateになりたくありません。あなた自身を言ったように、peoplePickerDelegateUIViewControllerなければなりません。

したがって、MyViewControllerになります。まず、インターフェース: - 変更すべき唯一のことは、ABPeoplePickerNavigationControllerDelegateに追加され、変更すべきではありません

/* MyViewController.h */ 

@interface MyViewController : UIViewController<ABPeoplePickerNavigationControllerDelegate> 
... 
@end 

はあなたのコントローラは、(テーブルビューコントローラまたはそのような何かのような)のUIViewControllerの子孫から継承するかもしれません実装されたプロトコルのリスト私が望んとして、上記の提案のいずれかを実行させることができませんでした

/* MyViewController.m */ 

@implementation MyViewController 

... 
- (void) whateverMethodIsDisplayingTheAddressBook 
{ 
    ABPeoplePickerNavigationController *abPicker = [[ABPeoplePickerNavigationController alloc]init];  
    abPicker.peoplePickerDelegate = self; // This view controller is the delegate 
    [self presentModalViewController:abPicker animated:YES]; 
    [abPicker release]; 
} 

... 

- (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; 
} 

@end 
+0

私はあなたが表示されている概念を実装しようとしているので、応答が遅れます。私は大きなイメージを理解していますが、私があなたが意味すると思うものをコード化すると、きれいなコンパイルから10のエラーになります。 は、それから私は、唯一のMyprogAppDelegateはNSObjectのから派生したとdismissModalViewControllerAnimated方法はのUIViewControllerオブジェクトから派生しなければならないという壁にまで来てMyprogAppDelegateにAddressBookDelegateを統合しようとしました。 私はそれを肉付けできるかどうかを確認するために再び戻ってあなたの構造につもりです。私は間違ったトラックにいるというあなたの "Do not do this"の例を理解しています。 ABPeoplePickerNavigationControllerDelegateプロトコルはのUIViewControllerから派生しなければならないためのUIViewController :あなたは @interfact AddressBookDelegateの機能を複製ところ、私は見ていないあなたのabouve structionで – Ric

+0

。私のためにもう少し詳しく説明してあなたの例を書き直すことに私は勝つことができますか?私はそれに時間を与えています。 – Ric

+0

もう少し時間をかけて書類を見て、書きました。最大の変化は、あなたがすべてでAppDelegateを使用してではなく、人々はデリゲートをピッカどんなビューアドレス帳を産卵されたコントローラ作るべきではないということです。 – Matt

関連する問題