0

私は何時間も費やしましたが、これを理解することはできません。ここで起動される詳細ビューコントローラ(UITableView)があります:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    EventLocationDetailController *newDetailViewController = [[EventLocationDetailController alloc] initWithNibName:@"EventLocationDetailController" bundle:nil];
    self.eventDetailController = newDetailViewController;
    [self.navigationController pushViewController:self.eventDetailController animated:YES];

    [newDetailViewController release];

}

詳細ビューコントローラには、以下のメソッドを呼び出して、ユーザーの選択を確認するスライドインスライドアウトアニメーションを表示するボタンメソッドがあります。

-(void)confirmLastActionWithMessage:(NSString *)message {

ConfirmActionViewController  *newConfirmActionViewController = [[ConfirmActionViewController alloc] initWithNibName:@"ConfirmActionViewController" bundle:nil];
self.confirmActionViewController = newConfirmActionViewController; 
[newConfirmActionViewController release];

[[self.view superview] addSubview:self.confirmActionViewController.view];

}

アニメーションが終了したことを示すConfirmActionViewControllerによって呼び出されるプロトコルメソッド。

-(void)didFinishConfirmDisplay:(UIView *)viewToRemoveFromSuperview {

     [viewToRemoveFromSuperview removeFromSuperview];
}

これは、最初にボタンを押したときに完璧に機能します。詳細コントローラーをポップしてスタックに戻し、ボタンをもう一度押すと、何も起こらず、その後メソッドを呼び出すたびに詳細コントローラーのスーパービューはゼロになります。viewWillAppearSuperviewは、confirmLastActionWithMessageメソッドに到達した場合にのみ、詳細ビューのメソッドでnilではありません。その間に他のユーザー操作は発生しません。どうすればスーパービューを取り戻すことができますか?アニメーションなしで機能する同様のコードがあります。

また、スタックからポップされたときに、詳細ビューコントローラーがdeallocを呼び出さなかったことにも気づきました。問題がどこにあるのかわからない。

ありがとう。

編集1

わかった。addSubview行を次の行に置き換えました。

[self.view insertSubview:self.confirmActionViewController.view atIndex:0];

アニメーションビューは、テーブルセルの1つの下に表示されました。テーブルセルの1つがスーパービューを盗むことができますか?

4

1 に答える 1

1

サブビューをスーパービューに追加する必要がある理由がよくわかりません。self.view だけに追加してみませんか

スーパービューがない理由を説明できないかもしれませんが、コントローラ ビューを self.view に追加するか、または

[[[[UIApplication sharedApplication] delegate] window] addSubview:yourview];

これにより、すべての上にビューがレンダリングされます。

于 2012-07-03T17:03:43.810 に答える