2

我正在开发一个显示地点列表的应用程序。有一个 NavigationController,在导航栏中我有一些 UIBarButtonItem(左右),中间部分是一个带有标签和两个 UIButton 的自定义视图。

工具栏

地图按钮执行对在地图上显示点的 MapViewController 的转场。我想要实现的是地图ViewController的导航栏也显示相同的自定义UIView(显示箭头按钮和Day Label),但我不知道如何实现这一点。我试图复制 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;
        }
    }
}

但这不起作用。此外,当从原始表格视图返回时,导航视图消失了:

走了

我想知道我的方法是否错误。我可以在 segues 之间保留 navigationcontroller 视图吗?我可以使用navigationcontroller 和segue 的吗?或者我应该在控制器内部只有两个视图并以编程方式交换它们?这两个视图的模型是相同的,它只是改变了我呈现信息的方式(地图或列表)。

提前致谢。

4

3 回答 3

1

当您回到第一个导航控制器时,标题视图没有出现在它的原因是您已经更改了它的超级视图。每个视图只能有一个超级视图,并且您将其移动到下一个视图控制器的视图。

但我不知道为什么它根本没有出现在第二个视图控制器上。我刚刚制作了一个与您的代码完全相同的示例应用程序,下一个视图控制器确实显示了第一个的标题视图。然而,当它回来时,第一个没有标题视图。我试图通过将标题视图存储在第一个控制器上的属性中并在 viewWill/DidAppear 中再次设置它来解决此问题:如果它不是 nil,但它会在动画期间显示标题视图,然后将其删除。

所有这些听起来都不像预期的行为,所以我会做更多的测试并报告一个错误(或者回来提供一个更好的答案)。我建议你这样做。

于 2012-07-05T12:35:02.170 回答
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:第二个中使用时,它根本不起作用。

尝试在 a 中执行此操作的问题prepareForSegue:在于它仅在推送方向上有效。但是,您确实可以访问两个控制器,在其本身的destinationViewControllersourceViewController字段中segue。但是为了让它在另一个方向上工作,你必须把相同的代码放在unwind segue. 我认为我的解决方案可能是最简单的(特别是因为您想为导航控制器管理的所有视图控制器执行此操作)。

于 2013-06-29T17:12:55.360 回答
-1

好的,我终于想通了。我认为实现这种行为的最佳方法是不在视图控制器之间使用 segue。由于两个视图是呈现相同数据的不同方式,我实现了一个具有两个视图(列表和地图)的控制器,然后使用一个按钮来执行交换视图的操作,如苹果开发人员库中所述:

- (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;
            }
    }];
}

动画 Apple 开发者库

使用这种方法我不会更改视图控制器,因此导航栏保持不变,我可以根据需要保留按钮。

于 2012-07-06T06:58:42.400 回答