ここでは、iOS 5 の機能を使用できることを前提としています。あなたができることは、コンテナー ビュー コントローラーを実装することです。UINavigationController によく似ていますが、独自のビュー レイアウトを使用して、ロゴ、検索バーなどをすべて所定の位置に保持し、ビューの一部のビュー間でのみ遷移することができます。
という名前の新しいコンテナ ビュー コントローラを作成しましたViewController
。containerView
.xib ファイルに設定された UIView アウトレットと、トップ バー、検索バー、およびボトム バー (アプリケーションで記述した他のビューに対応) があります。プロパティtableViewController
ともありますdetailViewController
。その実装では、インスタンスを子ビュー コントローラーとしてviewDidLoad
追加します。TableViewController
テーブル ビューがタップされると、View Controller はDetailViewController
インスタンスを子 View Controller として追加し、それに遷移します。詳細ビューのボタンをタップすると、テーブル ビューに戻り、詳細ビュー コントローラーが子として削除されます。
これが私のviewDidLoad
方法です:
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableViewController = [[TableViewController alloc] init];
self.tableViewController.delegate = self; // I implement a protocol TableViewControllerDelegate to know when row is tapped
// Fix for origin being 20 by default.
CGRect frame = self.tableViewController.view.frame;
frame.origin.y = 0.0f;
self.tableViewController.view.frame = frame;
[self addChildViewController:self.tableViewController];
[self.containerView addSubview:self.tableViewController.view];
[self.tableViewController didMoveToParentViewController:self];
}
表の行がタップされたときにコンテナーが認識し、表のビューと詳細ビューの間の遷移を行うように、デリゲート メソッドがあります。その実装は次のとおりです。
- (void)tableViewController:(TableViewController *)tvc didSelectIndex:(NSInteger)index
{
self.detailViewController = [[DetailViewController alloc] init];
self.detailViewController.backButtonBlock = [self backButtonBlock]; // This block handles the transiton from detail back to table
CGRect detailStartingFrame = self.detailViewController.view.frame;
detailStartingFrame.origin.x = self.containerView.frame.size.width;
self.detailViewController.view.frame = detailStartingFrame;
[self addChildViewController:self.detailViewController];
[self transitionFromViewController:self.tableViewController
toViewController:self.detailViewController
duration:0.5
options:0
animations:^{
CGRect newTableFrame = self.tableViewController.view.frame;
newTableFrame.origin.x = (-1.0f * newTableFrame.size.width);
self.tableViewController.view.frame = newTableFrame;
[self.containerView addSubview:self.detailViewController.view];
CGRect newDetailFrame = self.detailViewController.view.frame;
newDetailFrame.origin.x = 0.0f;
self.detailViewController.view.frame = newDetailFrame;
} completion:^(BOOL finished) {
[self.detailViewController didMoveToParentViewController:self];
}];
}
前述のように、詳細ビューは戻るボタンをタップするとブロックを実行します。ここにこのブロックを作成しViewController
ます。
- (GoBackButtonBlock)backButtonBlock
{
GoBackButtonBlock block = ^ {
[self.detailViewController willMoveToParentViewController:nil];
[self transitionFromViewController:self.detailViewController toViewController:self.tableViewController duration:0.5 options:0 animations:^{
CGRect newDetailFrame = self.detailViewController.view.frame;
newDetailFrame.origin.x = self.containerView.frame.size.width;
self.detailViewController.view.frame = newDetailFrame;
CGRect newTableFrame = self.tableViewController.view.frame;
newTableFrame.origin.x = 0.0f;
self.tableViewController.view.frame = newTableFrame;
} completion:^(BOOL finished) {
[self.detailViewController removeFromParentViewController];
[self.detailViewController.view removeFromSuperview];
}];
};
return [block copy];
}
それだけです。詳細については、 UIViewController クラス リファレンスの「コンテナー ビュー コントローラーの実装」セクションを必ずお読みください。お役に立てれば!