Ipad 选项卡栏中的UISplitViewController(UITabBarController)?

Ipad 选项卡栏中的UISplitViewController(UITabBarController)?,ipad,uitabbarcontroller,iphone-sdk-3.2,uisplitviewcontroller,uipopovercontroller,Ipad,Uitabbarcontroller,Iphone Sdk 3.2,Uisplitviewcontroller,Uipopovercontroller,我的情况是,我需要从一个基于选项卡的应用程序开始,并且需要一个或多个选项卡的拆分视图。但似乎无法将拆分视图控制器对象添加到tabbarController。(尽管tabbar对象可以添加到splitviewcontroller) 这个问题可以从其他方面看:我在左边有一个全屏,我有一个表格视图,当表格中的任何一行被选中时,弹出的弹出框应该指向该行。现在,当选择popover中的任何一行时,此popover中的行将位于选定行的左侧(只有此行可见),而另一个popover将从选定行中出现。(面包屑导航

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

这个问题可以从其他方面看:我在左边有一个全屏,我有一个表格视图,当表格中的任何一行被选中时,弹出的弹出框应该指向该行。现在,当选择popover中的任何一行时,此popover中的行将位于选定行的左侧(只有此行可见),而另一个popover将从选定行中出现。(面包屑导航类型)

我想我解释得很清楚。伙计们,有什么想法或解决办法吗

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

谢谢


Madhup要使tabbarcontroller显示为splitviewcontroller的主视图,您应该重写tabbarcontroller,使其支持或定向(例如,使用UITabBarController类的类别)

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

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;
在应用程序delegate
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];

这将创建一个选项卡栏控制器(在本例中只有一个选项卡),它在所有方向上都能正确显示。

我制作了一个示例应用程序。并发现我们可以通过编程方式完成,如:

- (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;
    }

希望这能有所帮助。

请参阅我关于将拆分视图控制器改装为现有选项卡栏界面的帖子:

请记住,OS 3.2没有为拆分视图作为选项卡栏视图提供适当的支持

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

由于这个问题,我得出结论,我必须创建自己的splitview,以便在tabBarController中使用


我听说苹果正在进行修复,但已经几个月了,iPad操作系统还没有更新——也许iPad的操作系统4会解决这个问题。

你可以使用IB来构建tabtab并修改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;

}

我已经为UISplitViewController编写了一个子类,它将侦听设备方向的更改并相应地调整自身的方向。有了这个类,我现在可以将分割视图放置在UITabBarController中,并且每个分割视图在旋转时都会正常工作,即使它不是最前面的选项卡。我已在中成功部署此应用,并已批准在应用商店中使用,但您的里程可能会有所不同。请查看Github上的存储库


请随意修改它,我总是对听到关于它的评论(或抱怨)感兴趣

我们成功地在iOS5+iPad上的UITabViewController中安装了一个UISplitViewController

长话短说:它有效:

  • 开箱即用,如果您也接受纵向拆分
  • 有点 工作,如果您想将主视图隐藏在纵向中,以及 让它只在点击按钮时出现
第二种情况下的诀窍是使用IntelligentSplitViewController(参见一些帖子,thanx Greg Combs)或类似地扩展UISplitVC,并注意splitview控制器子类的委托始终是活动对象

我们已经详细说明了以下流程:


我创建了一个UITabBarController子类,它将旋转消息正确地传播到它包含的所有UISplitViewController。这将保持UISPlitViewController的正确内部状态。但是,如果SplitViewController不可见,则不会调用其中一个SplitViewController委托方法,因此我在detail view controller ViewWillAspect方法中对此进行了说明。我已经在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
DetailViewController

@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

如此接近一个可以接受的答案,但却是一个蛮力的答案,我在等待更有趣的答案……)。这是一次很好的尝试。所以我投票给你。这是我采用的方法。。。看看我的答案。杰森,你能详细说明你的方法吗?您是在子类化splitviewcontroller还是在使用类别?什么方法调用是罪魁祸首?我一直在追根究底,试图找到正确的方法来提醒其他SplitView方向的改变。我并没有超越暴力,但我已经精疲力竭了。我想我已经明白了。。。我捕获两个状态栏方向更改通知,然后如果splitview不是可见的,则手动调用super will/did rotate。然后,为了处理现在出现在横向中的弹出按钮,我还手动通知splitview代理何时将从纵向转换到横向并返回。我编写了自己的,没有引用任何内置的splitviewcontroller内容。对我来说,主要的问题是确保我处理了另一个选项卡中出现的内存不足的情况,然后确保“拆分视图”选项卡在返回时能够自动设置。除此之外,主要工作是在再次激活/显示时确定“当前方向”,并根据需要调整视图。我发现当前的“设备”方向并不总是一个很好的参考值,所以我从tabbarcontroller本身获取了当前的方向值。嗨,Jason,您是否愿意详细介绍一下您的方法,或者分享一些代码?我正在努力解决一个完全相同的问题,即方向更改不会传播到不可见(拆分)视图控件