如何添加 iPad 子视图控制器以充当标签栏

Posted

技术标签:

【中文标题】如何添加 iPad 子视图控制器以充当标签栏【英文标题】:How to add iPad subview controller to act like a Tab Bar 【发布时间】:2012-06-30 21:13:33 【问题描述】:

我有一个应用程序,我刚刚设置了一个拆分视图控制器,以在该应用程序的 ipad 版本上显示博客。当前设置是主控制器是一个表格视图,用于显示博客中的不同文章,而详细控制器是一个视图控制器,里面有一个 webview 用于显示文章的内容。问题是我在应用程序中有一些其他功能,在 iPhone 版本上,我使用标签栏控制器进行导航。有哪些选项可以将按钮添加到细节控制器以允许我导航到应用程序的其他部分?我知道我无法在拆分视图控制器中获得选项卡栏控制器,所以我只需要一些指导。

我知道 Engadget 应用程序已设置为,当您以纵向模式打开时,它会显示应用程序的表格视图,并在底部显示一个控制器以访问照片等不同内容,而在横向模式下,表格视图是在左边,文章的文本在右边。我只想设置它,这样如果您以纵向模式打开,就没有空白页面,并且除了在导航栏上添加按钮之外,还具有查看其他页面的功能。

【问题讨论】:

【参考方案1】:

您可以将 tabBarController 添加到 SplitViewController 的详细视图。只需创建一个响应<UITabBarControllerDelegate>UIViewController 并在该控制器的xib 文件中添加一个UITabBarController 对象并将其链接到您的UIViewController。在您的 viewDidLoad 中将 Tab bar 控制器添加到视图中:

-(void)viewDidLoad 

     ...

     [self addChildViewController:myTabBarController];

     //add the tabBarController view
     [self.view addSubview:myTabBarController.view];


UIViewController 将分配给您的详细信息视图。这行得通,我以前试过。但是,苹果是否会允许呢?我不知道!

编辑:

首先你们千万不要自己打电话给viewDidLoad

另外,我认为您不需要 rootipaddetailipad,只要控制器链接到 xib 文件中的 SplitViewController。

在您的RootViewiPad(主)中,在其viewDidLoad 中添加以下内容:

-(void)viewDidLoad 

    ...

    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 

        //select the first row to load 
        [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];

        //NOTE, I'm assuming that selecting the cell will load the detail view.
        //if that is not the case, you need to do what ever you need to load the 
        //detail view.
    

如果您希望每次都发生这种行为(不仅是在第一次加载时),那么请将代码添加到 -(void)viewWillAppear 方法中。

【讨论】:

不知道我是否想尝试一些最终可能会被 Apple 拒绝的东西。也许更好的选择是以某种方式获取详细视图(以纵向模式显示整个屏幕的视图)以在启动时获取最新文章,并在启动时显示它而不是空白?但是,也不知道该怎么做。 我不确定这是否会被苹果拒绝。如果他们的指导方针没有严格提到你不能在 splitView 中有一个 tabBarController 那么上面的就可以了。对于你的其他解决方案它安静简单.. 由于主视图控制器是一个 tableViewController,检查viewDidLoad 上的方向然后只需让selectRowAtIndexPath:animated:scrollOption: 选择第一个选项以加载详细视图。 我不确定您在这里指的是什么,但这是我尝试过的。在 AppDelegate didFinishLaunching 上,我将主控制器(表视图)设置为控制器,并告诉它在主控制器代码中运行一个方法。然后告诉此方法从索引 0 处的数组中选择条目。问题是由于某种原因没有进行解析,因此未创建数组,并且由于错误索引 0 超出空数组的范围而崩溃 您能否发布代码以说明您如何创建UISplitViewController 以及如何将主控制器分配给它? 当然,请参阅此处查看 AppDelegate.h:link 对于 AppDelegate.m:link 然后我去了 IB MainWindow.xib,添加了一个 SplitViewController,并连接了所有连接 一切正常正确...可以旋转到横向,选择一篇文章,它显示在详细信息视图中...只是希望详细信息视图自动加载第一个故事,这样如果用户以纵向模式打开,而不是空白屏幕,他们获取第一个故事。

以上是关于如何添加 iPad 子视图控制器以充当标签栏的主要内容,如果未能解决你的问题,请参考以下文章

如何防止子视图重叠标签栏?

如何使用 swift 在子视图中添加标签栏和导航栏?

设置视图控制器,例如 Find My Friends iPad 应用

如何重绘标签栏控制器显示的视图

如何在 iOS 中检索数据并将数据传递给标签栏控制器的子视图?

如何在 1 项标签栏控制器中制作顶部标签栏以快速显示多个视图控制器?