28

我有一种情况,我需要从基于选项卡的应用程序开始,并且我需要一个或多个选项卡的拆分视图。但似乎无法将拆分视图控制器对象添加到 tabbarController。(虽然可以将 tabbar 对象添加到 splitviewcontroller 中)。

可以通过其他方式看到问题:我在左侧有一个全屏我有一个表格视图,当在表格中选择任何行时,弹出框应该指向该行。Now when any row in the popover is selected the rows in this popover comes to the left under the selected row (only this row would be visible) and another popover comes out from the selected row. (面包屑导航类型)

我想我解释的很清楚。那么伙计们有什么想法或解决方法吗?

如果我的问题不清楚,请告诉我。

谢谢,

马杜普

4

9 回答 9

19

使用界面生成器,创建一个拆分视图控制器和一个标签栏控制器并将它们链接到您的插座:

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;

在您的应用委托didFinishLaunchingWithOption中,将您的拆分视图控制器分配给标签栏控制器:

splitViewController.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Title" image:nil tag:0] autorelease];
NSArray *controllers = [NSArray arrayWithObjects:splitViewController,  /* other controllers go here */ nil];
tabBarController.viewControllers = controllers;
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];

这将创建一个标签栏控制器(在这种情况下只有 1 个标签),它可以在所有方向上正确显示。

于 2010-03-22T14:53:36.000 回答
9

我为 UISplitViewController 编写了一个子类,它将监听设备方向的变化并相应地定位自身。有了这个类,我现在可以在 UITabBarController 中放置拆分视图,并且每个拆分视图在旋转时都会正确运行,即使它不是最前面的选项卡。我已经在TexLege中成功部署了它,并且它被批准在 App Store 中使用,但你的里程可能会有所不同。请参阅 Github 上的存储库。

随意分叉和修改它,我总是有兴趣听到关于它的评论(或投诉)。 https://github.com/grgcombs/IntelligentSplitViewController

于 2010-11-16T16:19:24.150 回答
7

我做了一个示例应用程序。并发现我们可以像这样以编程方式做到这一点:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

        NSMutableArray *array = [NSMutableArray array];

        NSMutableArray *tabArray = [NSMutableArray array]; 

        UISplitViewController *splitViewConntroller = [[UISplitViewController alloc] init];

        MainViewController *viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];




        [splitViewConntroller setViewControllers:array];

        [tabArray addObject:splitViewConntroller];

        [splitViewConntroller release];

        array = [NSMutableArray array];

        splitViewConntroller = [[UISplitViewController alloc] init];

        viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        [splitViewConntroller setViewControllers:array];

        [tabArray addObject:splitViewConntroller];

        [splitViewConntroller release];

        // Add the tab bar controller's current view as a subview of the window
        [tabBarController setViewControllers:tabArray];

        [window addSubview:tabBarController.view];
        [window makeKeyAndVisible];

        return YES;
    }

希望这可以帮助。

于 2010-04-01T13:22:16.827 回答
2

要让 tabbarcontroller 显示为 splitviewcontroller 的主视图,您应该重写 tabbarcontroller 以便它支持或方向(比如说,使用 UITabBarController 类的类别)

于 2010-03-22T13:51:53.707 回答
2

请参阅我关于将拆分视图控制器改装到现有标签栏界面的帖子:http: //markivsblog.blogspot.com/2010/04/retrofit-ipad-uisplitviewcontroller.html

于 2010-04-16T16:10:31.853 回答
2

我创建了一个 UITabBarController 子类,它将旋转消息正确地传播到它包含的所有 UISplitViewControllers。这维护了 UISplitViewControllers 的正确内部状态。但是,如果 SplitViewController 不可见,则不会调用其中一个 SplitViewController 委托方法,因此我在详细视图控制器 viewWillAppear 方法中对此进行了说明。我已经确认这适用于 iOS5.0 - iOS6.1

OSTabBarController.m

#import "OSTabBarController.h"

@implementation OSTabBarController

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    for(UIViewController *targetController in self.viewControllers){
        if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){
            [targetController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
        }
    }
}

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    for(UIViewController *targetController in self.viewControllers){
        if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){
            [targetController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
        }
    }
}

@end

细节视图控制器

@implementation OSDetailViewController

-(void)viewWillAppear:(BOOL)animated{
    //the splitViewController:willHideViewController:withBarButtonItem:forPopoverController: may not have been called
    if(!UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){
        self.navigationItem.leftBarButtonItem = nil;
    }
}

#pragma mark - UISplitViewControllerDelegate Methods

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];

}

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    [self.navigationItem setLeftBarButtonItem:nil animated:YES];
}

@end
于 2013-03-28T15:30:39.733 回答
1

请记住,OS 3.2 不提供对拆分视图作为选项卡视图的 适当支持。

你可以让它“工作”,但它会有错误 - 最大的是在另一个选项卡的视图上所做的方向更改通常不会正确传播到 splitview 选项卡视图,当你返回它时会使视图变得古怪(左侧view 接管屏幕,或者 barbutton 项丢失等)。

我得出的结论是,由于这个问题,我必须创建自己的拆分视图以在 tabBarController 中使用。

我听说有传言说 Apple 正在努力解决这个问题,但现在已经几个月了,还没有发生任何 iPad OS 更新——也许 iPad 的 OS 4 会解决这个问题。

于 2010-06-30T13:35:58.193 回答
0

您可以使用 IB 构建 tabtab 并将 tabs 修改为 splitviewcontroller。

-(void) makeSplitViewController {
NSMutableArray *controllers = [NSMutableArray arrayWithArray:tabBarController.viewControllers];
int index = 0;

for (UIViewController *controller in tabBarController.viewControllers) {
    if ([controller.tabBarItem.title isEqualToString:@"Stock"]) {
        stockDetailController = [[StockDetailController alloc] initWithNibName:@"StockDetailController" bundle:nil];

        stockMasterController = [[StockMasterController alloc] initWithStyle:UITableViewStylePlain]; 
        stockMasterController.navigationItem.title = date;
        stockMasterController.stockDetailController = stockDetailController;

        UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:stockMasterController] autorelease];

        splitViewController = [[UISplitViewController alloc] init];
        splitViewController.tabBarItem = controller.tabBarItem;
        splitViewController.viewControllers = [NSArray arrayWithObjects:nav, stockDetailController, nil];
        splitViewController.delegate = stockDetailController;

        [controllers replaceObjectAtIndex:index withObject:splitViewController];
    }

    index++;
}

tabBarController.viewControllers = controllers;

}

于 2010-08-20T00:02:44.297 回答
0

我们成功地在带有 iOS5+ 的 iPad 上的 UITabViewController 中拥有一个 UISplitViewController。

长话短说:它有效:

  • 如果您也接受纵向拆分,则开箱即用;
  • 如果您想将主视图隐藏在纵向中,并且仅在点击按钮时才出现,则需要做一些工作。

第二种情况的技巧是使用 IntelligentSplitViewController(参见一些帖子,thanx Greg Combs)或类似地扩展 UISplitVC,并注意 splitview 控制器子类的委托始终是活动对象。

我们详细介绍了以下流程:

https://devforums.apple.com/message/763572#763572

于 2012-12-07T22:40:11.980 回答