2012-05-09 18 views
0

マップビューを管理するコントローラのヘッダファイルにプロトコルを宣言しました。プロパティ値を設定しようとしましたが、それはゼロです。

@protocol UCMapViewDelegate <NSObject> 
@required 
- (void)pushMapviewRight; 

@end 

Iは、別のビューコントローラ(.H)におけるプロトコルの実装を宣言し、私はその点プロパティにデリゲートを設定してい

// in the UCRootViewController.h 
@interface UCRootViewController : UIViewController <UCMapviewDelegate> 

// in the UCRootViewController.m 
- (void)pushMapviewRight 
{ 
    NSLog(@"push mapview right"); 
} 

.mファイルに実装していrootviewControllerに渡します。これは、私のMapviewControllerのviewDidLoad()で行われ、プロパティーは@property (weak, nonatomic) id<UCMapViewDelegate> delegate;です。

// in UCRootViewController 
self.mapviewController.rootviewController = self; 

// in UCMapViewController 
self.delegate = (id<UCMapviewDelegate>)self.rootviewController; 

委任されたメソッドを呼び出す。 showMenu()は、mapviewControllerのボタンが押されて動作したときに実行されます。デリゲートメソッドは呼び出されません。

- (void)showMenu 
{ 
    NSLog(@"show menu"); 
    [self.delegate pushMapviewRight]; 
} 

何も起こりません。何が間違っていますか?ヘルプは大歓迎です!

+0

代わりにその狂気の鋳造のすべての.Hにデリゲートに準拠するためにあなたの意図を宣言することで、それは多くの厄介なことを保存します。 appDelegateにデリゲートを設定しないでください(これはそれが目的ではありません)、関連するデリゲートクラス(あなたの場合はUCRootViewController内)に設定してください。 – CodaFi

+0

appDelegateに設定されていません。私はmapviewController UCRootViewControllerである)viewDidLoadに – MJB

+1

デリゲートを配置する場所に 'self.rootviewController'の値を記録するとどうなりますか? –

答えて

0

私はそれを修正しました。最初はNSLogを使って自分自身がゼロではないことを確認しました(これはかなりわかります)。なぜ実際にはわからないのですが、self.mapviewController.rootviewController = self;はself.rootViewControllerを参照したい点まで "持ち越さない"私がrootViewControllerへのポインタに設定した時点で、selfはゼロではありませんでした。

initWithRootViewController:(UCRootViewController*) ctrlをもう1つ作成して修正し、MapViewControllerを作成したときにselfを引数として渡しました。

self(= rootViewController)への有効な参照がMapViewControllerで使用できなかった理由を説明できますか?

0

rootViewControllerは強い参照か弱い参照ですか?おそらく強いはずです。オブジェクトへの弱い参照がない場合、すぐに解放され、弱い参照は、それらが指し示すオブジェクトが解放されたときに明示的に参照されなくなります。オブジェクトがハングアップするアプリケーションのどこかに強い参照が必要です。

+0

強いです。多分あなたは私の答えを見て、私に説明することができますか? – MJB

+0

'rootViewController' *を前に取っておき、それを' delegate'プロパティに代入してもよろしいですか?両方にブレークポイントを設定し、どれが最初にトリガされるかを確認してください。 – Jim

+0

はい、私はしました。私の問題を解決した、私の答えを参照してください – MJB

0

@CodaFiは言ったように、あなたのコードは乱雑に見えます。 UCMapViewControllerでデリゲートプロパティの値を設定するのはなぜですか?デリゲートは、ポップアップ時に親に設定するか、セグを準備します。

基本的に、UCMapViewControllerがデリゲートメソッドを実装するUCRootViewControllerに関する知識を持っている場合、そのメソッドをriitVuewControllerから直接呼び出してみませんか?デリゲートを設定する必要はありません。ここで

は、ストーリーボードとセグエを使用しての一例であり、UCMyViewControllerはUCMapViewControllerにセグエをプッシュするつもりです:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    ... 
    [segue.destinationViewController setDelegate:self.rootViewController]; 
    ... 
} 
+0

はい。私は、rootViewControllerへの参照を削除し、initWithDelegateメソッドでデリゲートを設定しました – MJB

関連する問題