【问题标题】:Push from Tab Bar Controller to a new Tab Bar Controller从标签栏控制器推送到新的标签栏控制器
【发布时间】:2014-08-07 14:47:51
【问题描述】:

我在标签栏页面上有一个UITableView。现在,如果我点击UITableViewCell,我想推送到一个新的标签栏控制器。

我的故事板现在看起来像这样:

我的问题是当我点击单元格时,它会打开新页面(图中右上角的Controller),但TabBar仍然和以前一样,即使我设置了导航栏标题也是空的( self.title = @"Test";)

这里有一些代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"segue" sender:self.view];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"segue"])
    {
        NSIndexPath *indexPath = [myTableView indexPathForSelectedRow];

        self.myTabbarController = (UITabBarController*)[segue destinationViewController];
        self.topRightController = [self.myTabbarController.viewControllers objectAtIndex:0];
        self.topRightController.value = [Values objectAtIndex:indexPath.row];
    }
}

有人可以帮我解决这个问题吗?

【问题讨论】:

  • @danh 这是一个push segue,因为我想在push到第二个之后回到第一个TabBarController
  • 如果你在第一个 tabbarcontroller 中只使用一个 tab 为什么要把它当作 tabbar 控制器
  • @sreekanthk .. 这只是一个演示。我实际的故事板要大得多。

标签: ios uitableview uinavigationcontroller uitabbarcontroller segue


【解决方案1】:

我解决了我的问题。我把我的故事板改成这样(不是我的实际故事板):

我不再使用 push segue。我现在使用模态序列。我使用自己的后退按钮返回到第一个标签栏控制器。

这里是didSelectRowAtIndexPath 方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITabBarController *tab = [self.storyboard instantiateViewControllerWithIdentifier:@"newTabBarController"];

        self.myNavController = [tab.viewControllers objectAtIndex:0];
        self.topRightController = [self.myNavController.viewControllers objectAtIndex:0];
        self.topRightController.value = [Values objectAtIndex:indexPath.row];

        [self presentViewController:tab animated:YES completion:nil];
    }

【讨论】:

  • 这对我有用。如何向呈现的控制器添加后退按钮?我尝试添加自定义按钮,但没有显示。
【解决方案2】:

问题在于,push segue 是导航控制器上下文中的推送,它发生在现有的标签栏控制器内部。要获得您想要的效果,请将其设为模态演示,在呈现的(新)导航控制器上滚动您自己的后退按钮。该按钮的操作将是一个dismissViewController。

另一种选择是不理会您的导航控制器并根据推送的内容修改标签栏。 (使用哪种替代方法取决于应用程序语义)。这也很棘手,因为您需要通过导航控制器访问包含的标签栏 vc。

【讨论】:

    【解决方案3】:

    如果您创建一个委托方法并在创建您的第一个 UITabBarController 的类中实现该方法,那么您可以在那里创建新的 UITabBarController

    您需要实现-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 来调用委托方法,然后该方法将创建并显示新的UITabBarController,方式与显示第一个相同。

    如果您想要从新的UITabBarController 到原始的后退按钮,您需要手动将其添加到新控制器,因为默认的后退按钮是自动处理的,并且只存在于每个 UINavigationController .

    【讨论】: