我正在开发一个显示地点列表的应用。有一个NavigationController,在导航栏中我有一些UIBarButtonItem(左和右),中间部分是一个带有标签和两个UIButton的自定义视图。
地图按钮对MapViewController执行segue,以显示地图上的点。我想要实现的是地图ViewController的导航栏也显示相同的自定义UIView(显示箭头按钮和日标签),但我不知道如何实现这一点。我试图复制prepareForSegue上的视图:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"FlipFromListToMap"]) {
if ([segue.destinationViewController isKindOfClass:[DisplayTourMapViewController class]]){
DisplayTourMapViewController *cityListController = segue.destinationViewController;
cityListController.navigationItem.titleView = self.navigationItem.titleView;
}
}
}
但这不起作用。此外,当返回原始表格视图中的导航视图时:
我想知道我的做法是否错误。我可以在segue之间保留navigationcontroller视图吗?我使用navigationcontroller和segue是否可以?或者我应该在控制器内部有两个视图并以编程方式交换它们?两个视图的模型是相同的,它只会改变我呈现信息的方式(地图或列表)。
提前致谢。
答案 0 :(得分:1)
当您返回到标题视图时,第一个导航控制器上没有显示标题视图的原因是您已更改其超级视图。每个视图只能有一个超级视图,并且您将该视图移动到下一个视图控制器的视图。
但我不知道为什么它在第二个视图控制器上根本没有出现。我刚刚创建了一个与您的代码完全相同的示例应用程序,下一个视图控制器会显示第一个标题视图。然而,当它返回时,第一个没有标题视图。我尝试通过将标题视图存储在第一个控制器上的属性中并在viewWill / DidAppear中再次设置来解决此问题:如果它不是nil,但它在动画期间显示标题视图然后将其删除。
所有这些听起来并不像预期的行为,所以我会做更多的测试并报告错误(或者回答更好的答案)。我建议你这样做。
答案 1 :(得分:0)
我遇到了同样的问题:使用titleView项目推动正常工作,但是导航动画完成后弹出窗口会让它消失。我尝试了几乎所有的组合,但这是最终的工作:
1)在导航控制器的委托(我设置为自己)中,我插入了:
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
viewController.navigationItem.titleView = self.myCustomView;
}
2)然后在每个单独的视图控制器中(我有3个),我插入了:
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationItem.titleView = nil;
}
使用这些特定的回调方法非常重要。当我在第一个中使用willShowViewController:
而在第二个中使用viewDidDisappear:
时,它根本不起作用。
尝试在prepareForSegue:
中执行此操作的问题在于它只能在推送方向上运行。但是,您可以在destinationViewController
本身的sourceViewController
和segue
字段中访问这两个控制器。但要使其在另一个方向上工作,您必须在unwind segue
中添加相同的代码。我认为我的解决方案可能是最简单的(特别是因为您希望为导航控制器管理的所有视图控制器执行此操作)。
答案 2 :(得分:-1)
好的,我终于明白了。我认为实现这种行为的最佳方法是不在viewcontrollers之间使用segue。由于两个视图都是呈现相同数据的不同方式,因此我实现了一个具有两个视图(列表和地图)的控制器,然后使用按钮执行交换视图的操作,如Apple开发人员库中的注释:
- (IBAction)toggleMainViews:(id)sender {
[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView)
toView:(displayingPrimary ? secondaryView : primaryView)
duration:1.0
options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight :
UIViewAnimationOptionTransitionFlipFromLeft)
completion:^(BOOL finished) {
if (finished) {
displayingPrimary = !displayingPrimary;
}
}];
}
Animations Apple Developer Library
使用这种方法我不会更改viewControllers,因此导航栏保持不变,我可以根据需要保留按钮。