0

マップ ビューを管理する Controller のヘッダー ファイルでプロトコルを宣言しました。

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

@end

別のView Controller(.h)でプロトコルの実装を宣言し、.mファイルに実装しています

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

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

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

しかし、何も起こりません..何が問題なのですか?! 助けていただければ幸いです。

4

3 に答える 3

0

それを私が直した。最初はNSLogを使用して、selfがnilではないことを確認しました(これはかなり明白ですが、それでも)理由はわかりませんが、self.mapviewController.rootviewController = self;self.rootViewControllerを参照したいところまで「持ち越し」ませんでしたが、self rootViewControllerへのポインタに設定した時点ではnilではありませんでした。

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

誰かが自分自身(= rootViewController)への有効な参照がMapViewControllerで利用できなかった理由を説明できますか?

于 2012-05-10T00:36:59.010 に答える
0

rootViewControllerプロパティは強い参照ですか、それとも弱い参照ですか? きっと強いはずです。オブジェクトへの弱い参照がない場合、オブジェクトはすぐに解放され、弱い参照は、それらが指しているオブジェクトが解放されるとゼロになります。オブジェクトがたむろするために、アプリケーションのどこかに強い参照が必要です。

于 2012-05-10T00:40:31.457 に答える
0

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

基本的に、デリゲート メソッドを実装する UCRootViewController について UCMapViewController が認識している場合、riitVuewController からそのメソッドを直接呼び出さない理由はありません。デリゲートを設定する必要はまったくありません。

ストーリーボードとセグエを使用する一例を次に示します。UCMyViewController はセグエを UCMapViewController にプッシュします。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  ...
  [segue.destinationViewController setDelegate:self.rootViewController];
  ...
}
于 2012-05-10T00:54:25.070 に答える