7

ナビゲーション ベースのビュー コントローラーがあり、ビュー コントローラーで上部のナビゲーション バーを非表示にし、カスタム UIView をナビゲーション バーとして使用します。

UIView バーには戻るボタンがあり、Delegate メソッド (プロトコルを宣言しました) を使用して、戻るボタンが押されたときにビュー コントローラーと通信します。

CustomNavigation Bar id デリゲートでデリゲートを使用します。

メインのView Controllerで、ナビゲーションバーを割り当てるときにデリゲートを設定します

topBar = [[TopNavigationBar alloc] initWithFrame:CGRectMake(0, 0, 480, 40)];
topBar.lblTitle.text = @"Shop";
topBar.delegate = self;

ViewControllers の dealloc でこのバーを解放します。

戻るボタンを押すと、デリゲート メソッドを使用して、メインの ViewController で popViewController を呼び出します。

//in Custom Bar
-(void)ButtonPressed {
    [delegate TopNavigationBarBackButtonPressed];   
}

//In View COntroller
-(void)TopNavigationBarBackButtonPressed {

    [self.navigationController popViewControllerAnimated:YES];
}

ViewControllerがポップされ、コントロールは前のviewControllerに移動しますが、ViewControllerとUIViewの両方でdeallocが発生しません

私は何を間違っていますか?

4

1 に答える 1

17

わかった!最後に、問題が何であるかを理解しました。

はい、それは代表者でした。したがって、「戻るボタンを押す」方法では、デリゲートをNILに設定する必要があります。

-(void)TopNavigationBarBackButtonPressed {

 topBar.delegate = nil;
[self.navigationController popViewControllerAnimated:YES];
}

そして出来上がり、すべてのdeallocが呼び出されます。カスタムプロトコルを酷評します。私の人生の2日間私は二度と戻らないでしょう。

編集:OK、デリゲートをnilに設定する必要はありません。

プロパティで私は代理人を保持していたので、私はすべての問題を抱えていました。

@property(nonatomic, retain)id <ASNavigationDelegate>delegate;

これは

@property(assign)id <ASNavigationDelegate> delegate;
于 2010-12-23T07:47:19.530 に答える