web-dev-qa-db-ja.com

タブバーのUISplitViewController(UITabBarController)?

私は、タブベースのアプリケーションから開始する必要があり、1つ以上のタブの分割ビューが必要な状況にあります。しかし、分割ビューコントローラーオブジェクトをtabbarControllerに追加できないようです。 (ただし、tabbarオブジェクトはsplitviewcontrollerに追加できます)。

他の方法でも問題が発生する可能性があります。左側にフルスクリーンがあり、テーブルで行を選択すると、その行を指すポップオーバーが表示されます。これで、ポップオーバーの行が選択されると、このポップオーバーの行が選択された行の左下になり(この行のみが表示されます)、別のポップオーバーが選択された行から出てきます。 (パンくずナビゲーションタイプ)

私が説明したことははっきりしていると思います。だからみんなアイデアや回避策はありますか?

不明な点がある場合はお知らせください。

おかげで、

マダップ

28

サンプルアプリを作りました。そして、次のようにプログラムで実行できることがわかりました。

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

お役に立てれば。

7

インターフェースビルダーを使用して、分割ビューコントローラーとタブバーコントローラーを作成し、アウトレットにリンクします。

@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つのタブのみ)が作成され、すべての方向で正しく表示されます。

19
g_fred

私はUISplitViewControllerのサブクラスを作成しました。これは、デバイスの向きの変更をリッスンし、それに応じて向きを変えます。このクラスを使用すると、UITabBarController内に分割ビューを配置できます。各分割ビューは、最前面のタブでなくても、回転時に正しく動作します。これを TexLege に正常に展開し、App Storeでの使用が承認されましたが、実際の距離は異なる場合があります。 Githubのリポジトリを参照してください。

フォークして自由に変更してください。私は常にコメント(または苦情)を聞くことに興味があります。 https://github.com/grgcombs/IntelligentSplitViewController

9
Greg Combs

含まれているすべてのUISplitViewControllersに回転メッセージを適切に伝達するUITabBarControllerサブクラスを作成しました。これにより、UISplitViewControllersの正しい内部状態が維持されます。ただし、SplitViewControllerが表示されない場合、SplitViewControllerデリゲートメソッドの1つは呼び出されないため、詳細ビューコントローラーの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

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
2
Brody Robertson

分割ビューコントローラーを既存のタブバーインターフェイスに改造することに関する私の投稿を参照してください。 http://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uisplitviewcontroller.html

2
user318668

Tabbarcontrollerがsplitviewcontrollerのマスタービューとして表示されるようにするには、tabbarcontrollerを書き換えて、サポートまたは方向付けする必要があります(つまり、クラスUITabBarControllerのカテゴリを使用します)。

2
Yan Cheng

OS 3.2は、分割ビューをタブバービューとして適切なサポートを提供しないを行うことに注意してください。

あなたはそれを「機能させる」ことができますが、それはバグがあります-最大は、別のタブのビューで行われた方向の変更がしばしばsplitviewタブビューに適切に伝播せず、戻ったときにビューが奇妙に見えることです(左側)ビューが画面を引き継ぐ、またはbarbuttonアイテムが欠落しているなど)。

この問題のため、tabBarControllerで使用するために独自の分割ビューを作成する必要があるという結論に達しました。

Appleが修正に取り組んでいたという噂を聞いていましたが、今から数か月が経過しており、iPad OSのアップデートは行われていません。iPadのOS 4で対応できる可能性があります。

1
Jason

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;

}

0
mikezang

IOS5以降のiPadのUITabViewController内にUISplitViewControllerを含めることに成功しました。

長い話を短くするために:それはうまくいきます:

  • 分割をポートレートでも受け入れる場合は、そのまま使用できます。
  • マスタービューを縦向きで非表示にして、ボタンをタップしたときにのみ表示されるようにする場合は、少し手間がかかります。

2番目のケースでのトリックは、IntelligentSplitViewController(いくつかの投稿を参照、Greg Combsに感謝)を使用するか、UISplitVCを同様に拡張して、splitviewコントローラーのサブクラスのデリゲートが常にライブオブジェクトになるように注意することです。

以下のプロセスについて詳しく説明します。

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

0
zontar