我假设您可以在这里使用 iOS 5 的功能。您可以做的是实现一个容器视图控制器 - 很像 UINavigationController,但具有您自己的视图布局,因此您可以将徽标、搜索栏等全部保留在适当的位置,并且仅在视图的一部分中的视图之间进行转换。
我创建了一个名为ViewController
. 它有一个containerView
在 .xib 文件中设置的 UIView 出口,以及一个顶部栏、搜索栏和底部栏(对应于您在应用程序中描述的其他视图)。它还具有属性tableViewController
和detailViewController
. 在其viewDidLoad
实现中,它添加了一个TableViewController
实例作为子视图控制器。当点击表视图时,视图控制器添加一个DetailViewController
实例作为子视图控制器并转换到它。点击详细视图上的按钮将转换回表格视图,并将详细视图控制器作为子视图移除。
这是我的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 类参考的“实现容器视图控制器”部分以获取更多详细信息。希望这可以帮助!