我打算假设您可以在此处使用iOS 5功能。你可以做的是实现一个容器视图控制器 - 就像UINavigationController一样,但是使用你自己的视图布局,这样你就可以保持标识,搜索栏等全部就位,并且只在视图的一部分视图之间转换。
我创建了一个名为ViewController
的新容器视图控制器。它有一个UIView插座containerView
,它是在.xib文件中设置的,以及顶部栏,搜索栏和底部栏(对应于您在应用程序中描述的其他视图)。它也有属性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 class reference的“实施容器视图控制器”部分以了解更多详细信息。希望这可以帮助!
你好卡尔,首先我很抱歉,我没有回应。我很抱歉。你真的在努力工作,并花了一些时间。我为延误表示歉意。我生病了。我想我理解你的观点,并且从今天开始走这条路。谢谢。我会及时向大家发布。 – Sallu
@Sallu哦哇没问题,高兴你感觉好多了!如果您有任何疑问,请告诉我,或者我可以澄清一些事情。 –