【问题标题】:TabBarController and SplitViewControllerTabBarController 和 SplitViewController
【发布时间】:2011-12-18 15:04:59
【问题描述】:

我希望我的splitviewController 显示在TabBarController 中。不幸的是,我首先决定只拥有一个SplitViewController 并选择了苹果的模板。现在我处于不方便的位置,不知道如何将其添加到标签栏。

我尝试了几个在 StackOverflow 上解释过的东西,但最好的结果是黑屏,下面有一个标签栏:-(

我只是在努力寻找一种既简单又好用的方法。

我的Appdelegate的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
// Override point for customization after application launch.
// Add the split view controller's view to the window and display.
self.window.rootViewController = self.splitViewController;
[self.window makeKeyAndVisible];

NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentFolderPath = [searchPaths objectAtIndex: 0];
self.rootViewController.directoryPath = documentFolderPath; 

NSURL *docUrl = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
if ([docUrl isFileURL]) {
    NSString *path = [docUrl path];
    self.detailViewController.currentFilePath = path;
    [self.detailViewController setDetails:path newFile:FALSE];
}
return YES;

【问题讨论】:

  • 所以你想让你的 UITabBarController 的标签之一显示一个 UISplitViewController,里面有两个视图?
  • 查看我的答案,您也可以使用 Interface Builder。

标签: objective-c ios ipad uitabbarcontroller uisplitviewcontroller


【解决方案1】:

我刚刚解决了这个问题,因为它在过去几天一直在我的脑海背景中运行。 您可以在“UITabbarView”中拥有任意数量的“拆分视图”,反之亦然,无需使用任何代码,但如果您想满足 Apple 的要求并使拆分视图控制器成为根控制器,则必须键入一行代码。

所以牛肉就在这里。

  1. 创建一个单一视图项目,或任何您喜欢的项目。
  2. 在主 Storyboard 中拖放拆分视图控制器。
  3. 从“单一视图控制器”中拖动初始化箭头并 将其指定给您的“拆分视图控制器”。
  4. 现在,如果您运行项目,它应该会加载拆分视图。
  5. 新建“UISplitViewController”的coca touch文件子类,调用 随心所欲。
  6. 在“viewDidLoad”中添加以下行“self.preferredDisplayMode = .PrimaryHidden" // 只是为了隐藏主视图
  7. 返回主情节提要,选择拆分视图控制器,然后 让它成为您刚刚创建的视图控制器。
  8. 现在,删除详细信息视图控制器的“视图”(只是 查看)
  9. 在对象库中找到“容器视图”,将其拖放 它在细节视图控制器中。
  10. 这将生成连接到“容器”的视图控制器 View” 将生成的视图控制器嵌入“Tab Bar Controller” 现在,您已将拆分视图连接到标签栏控制器。
  11. 您的 TabBarController 应该有一个视图控制器(第 1 项), 将此控制器的“视图”(仅视图)替换为 “容器视图”。
  12. 现在从“对象”中拖放新的拆分视图控制器 library”将“Item 1”中的“ContainerView”连接到新添加的 “拆分视图控制器”。
  13. 现在,如果您还记得我们应该挂一个视图控制器 某处,当我们创建单视图项目时,发现 控制器将它连接到标签栏控制器,所以现在你 有 2 件商品。
  14. 重复相同的过程,将视图替换为“容器视图”,然后 添加新的拆分视图控制器并将其连接到此故事板。

现在,这个最终的故事板应该看起来像这样。同样,您不必从拆分视图控制器开始,但我这样做只是为了符合 Apple 的建议。

【讨论】:

    【解决方案2】:

    根据 Apple 的文档,这是不可能的。

    但有一种方法可以轻松实现这一点(我们是为应用程序做到的)。

    看看http://www.codeworth.com/blog/mobile/ios-splitviewcontroller-inside-tabviewcontroller/

    我认为这将是这个问题的恰当答案。

    【讨论】:

    • 太棒了!非常感谢!我还可以在splitviewcontroller's 纵向模式下使用弹出框代替左视图吗?
    • 当然可以。但是,我们应该对此有点棘手。我有一个想法,我会尝试回到你身边。
    • 我设法在 potrait 模式下隐藏了根视图,但导航控制器的后退按钮占据了左上角,因此它似乎有点复杂。
    • 猫王的回答也很贴切。但 IntelligentSplitViewController 似乎也没有左视图的弹出框
    • TabBarController 中的SplitViewController 不再是“不可以”。在 iPad 上查看 Apple 的 Podcasts 应用程序。
    【解决方案3】:

    你应该检查IntelligentSplitViewController是你需要的一切!

    添加一些控制器和设计,你可以这样结束:

    PS:我实际上在 App Store 中有一个使用这个控制器的应用,所以去吧!

    【讨论】:

      【解决方案4】:

      编辑:

      我刚刚意识到您实际上想要在标签栏内有一个拆分视图。根据苹果文档,这是不可以的。 http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/iPadControllers/iPadControllers.html

      拆分视图控制器必须始终是您的任何界面的根 创建。换句话说,您必须始终从 aUISplitViewController 对象作为应用程序的根视图 窗户。然后,您的拆分视图界面的窗格可能包含 导航控制器、标签栏控制器或任何其他类型的视图 你需要实现你的接口的控制器。


      如果您仍想使用标签栏,我在下面写的内容仍然适用,但您的子视图不应该是 splitview 控制器。

      原答案:

      您将在代码中创建标签栏控制器,然后将拆分视图控制器添加为标签之一。在您的情况下, self.splitViewController 将成为标签栏控制器内的视图控制器之一。我还没有尝试过使用苹果模板应用程序作为起点,但它应该可以工作。

      您可以在 uitabbarcontroller 上查找教程以获取更多信息。这个看起来很有希望:http://www.xcode-tutorials.com/uitabbarcontroller-and-uinavigationcontroller/

      这也很方便:http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITabBarController_Class/Reference/Reference.html

      这是一个示例:

         - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
          {
              // Override point for customization after application launch.
              UITabBarController *tabBarController = [[UITabBarController alloc] init];
              //set tbconroller as root view controller of window
              [self.window setRootViewController:tabBarController];
              //window retains controller so we can release
              [tabBarController release];
      
              //create two view controllers
              UIViewController *vc1 = [[HypnosisViewController alloc] init];
              UIViewController *vc2 = [[CurrentTimeViewController alloc] init];
              //make an array containing these two view controllers
              NSArray *viewControllers = [NSArray arrayWithObjects:vc1,vc2,nil];
      
              [tabBarController setViewControllers:viewControllers];
      
              //the views are retained their new owners, so we can release
              [vc1 release];
              [vc2 release];          
      
              [[self window] makeKeyAndVisible];
              return YES;
          }
      

      如果您使用的是界面生成器,这里还有一些教程http://www.cimgf.com/2009/06/25/uitabbarcontroller-with-uinavigationcontroller-using-interface-builder/http://www.mobisoftinfotech.com/blog/iphone/iphone-tabbar-uitabbarcontroller-tutorial/

      【讨论】:

      • 谢谢伙计!您使用了 Hillegass 的示例代码,对;) 我想知道是否有一种方法可以完全在 IB 中使用故事板和其他东西来完成它?
      • 好眼力! :) 我很喜欢这本书,并且仍然有一些示例代码漂浮在周围。我认为 IB 没有办法,因为苹果不希望我们这样做。
      • TabBarController 中的SplitViewController 不再是“不可以”。在 iPad 上查看 Apple 的 Podcasts 应用程序。
      猜你喜欢
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2016-11-19
      • 1970-01-01
      相关资源
      最近更新 更多