TabBarController和SplitViewController

7
我希望我的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;

1
所以你想让UITabBarController的一个选项卡显示一个包含两个视图的UISplitViewController? - Eduardo Scoz
请检查我的答案,您也可以使用界面构建器。 - 3lvis
4个回答

6
你应该检查一下IntelligentSplitViewController,这可能是你所需要的一切!
通过添加一些控制器和设计,你可以得到类似于以下截图的效果: Screenshot of an iPad app using IntelligentSplitViewController PS:我实际上有一个在App Store中使用此控制器的应用程序,所以去试试吧!

5

编辑:

我刚意识到您实际上想要在选项卡栏内使用分割视图。 根据苹果文档,这是不允许的。 http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/iPadControllers/iPadControllers.html

分割视图控制器必须始终是您创建的任何界面的根。 换句话说,您必须始终将UISplitViewController对象的视图安装为应用程序窗口的根视图。 然后,您的分割视图界面的窗格可以包含导航控制器,选项卡栏控制器或任何其他类型的视图控制器,以实现您的界面。


如果仍然想要使用选项卡栏,则下面写的内容仍然适用,但是您的子视图不应该是分割视图控制器。

原始答案:

您可以在代码中创建选项卡栏控制器,然后将分割视图控制器添加为其中一个选项卡。 在您的情况下,self.splitViewController将成为选项卡栏控制器内的一个视图控制器。 我没有尝试使用Apple模板应用程序作为起点,但是应该可以正常工作。

您可以寻找有关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、故事板等方式来完成它的方法? - Faser
1
好眼力! :) 我很喜欢这本书,而且还有一些样例代码。我认为在IB中没有办法,因为苹果不希望我们这样做。 - Mark
现在,在TabBarController中使用SplitViewController不再是“禁忌”了。请查看iPad上的Apple Podcasts应用程序。 - Steve Moser

3
我刚解决了这个问题,因为它在我的脑海中挥之不去了几天。 您可以在“UITabbarView”内部或者反过来有尽可能多的“Split view”,而不需要使用任何代码,但是如果您想满足苹果公司并使拆分视图控制器成为根控制器,则需要键入一行代码。 所以问题就在这里。
  1. 创建一个单一视图项目,或者您喜欢的任何项目。
  2. 在主故事板中拖放分割视图控制器。
  3. 从“单一视图控制器”中拖动初始化箭头,并指定为您的“分割视图控制器”。
  4. 现在,如果您运行项目,它应该加载分割视图。
  5. 创建新的Coca Touch文件,子类为“UISplitViewController”,随意命名。
  6. 在“viewDidLoad”中添加以下行“self.preferredDisplayMode = .PrimaryHidden” //只是隐藏主视图
  7. 返回到主故事板,选择分割视图控制器,并将其视图控制器设置为您刚刚创建的控制器。
  8. 现在,删除详细视图控制器的“View”(只有视图)
  9. 在对象库中查找“容器视图”,将其拖动并放置在详细视图控制器中。
  10. 这将生成与“Container View”连接的视图控制器,将生成的视图控制器嵌入“选项卡控制器”中,现在,您将Split View连接到Tab Bar控制器。
  11. 您的TabBarController应该有一个视图控制器(项目1),用“ContainerView”替换此控制器的“view”(仅视图)。
  12. 现在从“对象库”中拖放新的分割视图控制器,将“Item 1”中的“ContainerView”连接到新添加的“Split View Controller”。
  13. 现在,如果您回忆一下,我们应该有一个视图控制器挂在某个地方,因为我们创建了单一视图项目,找到该控制器并将其连接到选项卡栏控制器,这样您就有2个项目了。
  14. 重复相同的过程,用“容器视图”替换视图,并添加新的分割视图控制器并将其连接到此故事板。
现在,这个最终的Storyboard应该看起来像这样。再次强调,你不需要从Split view controller开始,但我这样做是为了与Apple的建议相匹配。

enter image description here

enter image description here


2

1
我成功地在竖屏模式下隐藏了根视图,但导航控制器的返回按钮占据了左上角,因此它似乎有点复杂。 - RamaKrishna Chunduri
1
Elvis的回答也是恰当的。但是IntelligentSplitViewController似乎也没有左视图的弹出窗口。 - RamaKrishna Chunduri
你认为使用故事板实现整个功能是否可行? - Faser
这个答案在我看来是错误的。你不应该这样做:[self.view addsubView:leftVc.view]; 这会创建不一致的层次结构(视图与视图控制器)。请参考2011年WWDC第102场会议,他们解释了为什么这是错误的。例如,方向更改将无法正确工作。 - Ondrej Peterka
1
在TabBarController中使用SplitViewController不再是什么禁忌了。可以查看一下iPad上的Apple播客应用程序。 - Steve Moser
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接