私は何時間も費やしましたが、これを理解することはできません。ここで起動される詳細ビューコントローラ(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];
}
これは、最初にボタンを押したときに完璧に機能します。詳細コントローラーをポップしてスタックに戻し、ボタンをもう一度押すと、何も起こらず、その後メソッドを呼び出すたびに詳細コントローラーのスーパービューはゼロになります。viewWillAppear
Superviewは、confirmLastActionWithMessageメソッドに到達した場合にのみ、詳細ビューのメソッドでnilではありません。その間に他のユーザー操作は発生しません。どうすればスーパービューを取り戻すことができますか?アニメーションなしで機能する同様のコードがあります。
また、スタックからポップされたときに、詳細ビューコントローラーがdeallocを呼び出さなかったことにも気づきました。問題がどこにあるのかわからない。
ありがとう。
編集1
わかった。addSubview行を次の行に置き換えました。
[self.view insertSubview:self.confirmActionViewController.view atIndex:0];
アニメーションビューは、テーブルセルの1つの下に表示されました。テーブルセルの1つがスーパービューを盗むことができますか?