当多个tableViewControllers(没有故事板)时如何pushViewController

Posted

技术标签:

【中文标题】当多个tableViewControllers(没有故事板)时如何pushViewController【英文标题】:How to pushViewController when more than one tableViewControllers (no storyboards) 【发布时间】:2014-02-13 04:27:18 【问题描述】:

我不知道如何实现表视图控制器的详细视图,当该表视图控制器由于用户与不是应用程序主视图的标签栏控制器交互而出现时。我想我需要创建第二个UINavigationController,但我不知道如何将它集成到将使用它的主视图控制器和详细视图控制器中,尽管我有一个适用于我的主视图控制器的导航控制器(EdgewoodSecretsMasterViewController)

(我读过PushViewController with tabBarController not working)

我还没有使用故事板。

我的应用的根视图是一个名为EdgewoodSecretsMasterViewController 的表视图控制器,用户可以在它填充的表中选择一行,显示详细视图,然后返回到EdgewoodSecretsMasterViewController 表视图。

我在这个主视图的底部还有一个标签栏。它有3个选择。一个是EdgewoodSecretsMasterViewController 它在用户启动应用程序时出现。用户可以选择表格中的一行,在详细视图上查看有关该选择的信息并返回到表格视图。

在应用委托中我创建了 vcMaster ,一个 EdgewoodSecrets 类

 EdgewoodSecretsMasterViewController *masterViewController = [[EdgewoodSecretsMasterViewController alloc] initWithNibName:@"EdgewoodSecretsMasterViewController" bundle:nil];

 UINavigationController * vcMaster = [[UINavigationController alloc] initWithRootViewController:masterViewController];

第二个标签栏选项是一个信息视图作者信息页面。用户可以选择它,然后返回原始表格视图,但单击第一个选项卡栏选项

WhoIsAuthor* vcAu = [[WhoIsAuthor alloc] init];

这两个选项按我的意愿工作。但不是第三个选项卡。 第三个标签是 vcImportant

   ImportantMasterViewController* vcImportant = [[ImportantMasterViewController alloc] init];

   initWithNibName:@"ImportantMasterViewController"
   bundle:nil ];

这里我把所有的选项卡选项都放到了选项卡栏控制器中

   UITabBarController *tabBar = [[UITabBarController alloc] init];

   NSArray* controllers = [NSArray arrayWithObjects:vcMaster, vcAu,vcImportant,
                         nil];

   tabBar.viewControllers = controllers;
  [[self window] setRootViewController:tabBar];

第三个选项卡选项带来了另一个表视图 - ImportantMasterViewController。该表视图填充了几个选项,但是当用户做出选择时,pushViewController 指令对原始导航栏控制器一无所知。在推送点 self.navigationController 没有值。我认为这是因为标签栏控制器是根视图控制器。所以我认为这是***别/负责人,我不知道要这么说。

在PushViewController with tabBarController not working

我看到 Alok Singh 回复“对于每个选项卡,您需要创建一个单独的导航控制器”

我可以在我的 appDelegate 中创建第二个 UINavigationController 对象。但是除了像这样在应用程序委托中设置它之外,我不知道如何使用它

 UINavigationController * ncImportant = [[UINavigationController alloc]      
      initWithRootViewController:importantMasterViewController];

似乎某处必须有一个堆栈,其中包含最后一个被推送的对象。看来我应该将我所有的视图控制器都推到那个堆栈上。

在 EdgewoodSecretsMasterViewController 中,我像这样推送我的详细视图

 [self.navigationController pushViewController:self.detailViewController animated:YES];

详细视图出现用户可以来回走动

在 WhoIsAuthor 中我没有显示详细的从属视图

在重要的MasterViewController 我尝试像这样推送我的详细视图

 [self.navigationController pushViewController:self.importantDetailViewcontrollers animated:YES];

详细视图没有出现。 我知道执行到了这一点。 我也看到了 self.navigationController 此时没有像 EdgewoodSecretsMasterViewController 中那样的值

那就是 - 如果我理解其他发布的权利 - 因为它需要它自己的导航控制器。但我不知道如何将我在应用程序委托中创建的导航控制器(ncImportant)与此推送相关联

我不知道如何思考这个问题,或者阅读什么来理解它。

谢谢 月桂树

【问题讨论】:

通过示例屏幕查看我的答案。如果您需要一些代码,请通过电子邮件联系。谢谢 【参考方案1】:

您需要将所有选项卡选项放入标签栏控制器,ncImportant 而不是vcImportant

UITabBarController *tabBar = [[UITabBarController alloc] init];

NSArray* controllers = [NSArray arrayWithObjects:vcMaster, vcAu,ncImportant,
                         nil];

tabBar.viewControllers = controllers;
[[self window] setRootViewController:tabBar];

【讨论】:

谢谢!我现在只处理常规的旧错误。我从没想过我会很高兴拥有我的代码炸弹。但它现在正在超越这一点。 稍后...它没有调出视图,但重要细节视图控制器中的导航控制器有一个值。我认为这是进步。【参考方案2】:

    UITabBarController 设为您的rootViewController。

    添加所有选项卡,在每个选项卡中,您可以使用任一选项对其进行初始化

    a) UINagivationController 依次初始化为 UIViewController 实例。 b) 或者只是你的UIViewContollers

    在加载您的应用时,您始终可以选择应显示的特定选项卡。

    然后,您可以使用 Push 或 Modal 方法将 OtherViewContollers1 显示为 TabBarController 的一个项目中所选项目的详细信息。

看到这个:

这是我的根 ViewController(一个包含三个选项卡的选项卡栏)

这是一个DetailViewController,其中有一个UITableView 作为实例。当我单击上表视图中的项目时,它会模态显示在 TabBar 上。

看看它是如何以模态方式呈现的。

希望有所帮助。

【讨论】:

以上所有代码都使用了CustomViews,而不是storyBoards。如果您需要一些代码示例,请通过 tiwari.balram@gmail.com 与我联系,并尽量不要将 *** 的此评论部分用作聊天窗口。 :-)

以上是关于当多个tableViewControllers(没有故事板)时如何pushViewController的主要内容,如果未能解决你的问题,请参考以下文章

设置具有多个部分和按钮的 tableviewcontroller

一个 TableViewController,多个 segue 动作和返回

如何通过来自同一个 TableViewController 的多个 segue 到同一个 ViewController

当 TableViewController 隐藏在 NavigationController 堆栈中时引用它

如何根据条件以编程方式移动到 tableViewController 或 viewController

从父 ViewController 更改嵌入 TableViewController 的数据