28

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

問題は別の方法で見ることができます: 左部分に全画面表示があります。表の行が選択されていると、その行を指すポップオーバーが表示されます。ポップオーバー内の任意の行が選択されると、このポップオーバー内の行が選択された行の下の左側に表示され (この行のみが表示されます)、別のポップオーバーが選択された行から出てきます。(パンくずナビ型)

私が説明したことは明らかだと思います。アイデアや回避策はありますか?

私の質問が明確でない場合はお知らせください。

ありがとう、

マドゥップ

4

9 に答える 9

19

Interface Builder を使用して、Split View Controller と Tab Bar Controller を作成し、それらをアウトレットにリンクします。

@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/retrofitting-ipad-uisplitviewcontroller.html

于 2010-04-16T16:10:31.853 に答える
2

回転メッセージを、含まれるすべての 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

詳細ViewController

@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 では、分割ビューをタブバー ビューとして 適切にサポートしていないことに注意してください。

「動作」させることはできますが、バグがあります。最大の問題は、別のタブのビューで行われた向きの変更が分割ビュー タブ ビューに適切に反映されないことが多く、戻ったときにビューがおかしくなることです (左側)。ビューが画面を引き継ぐか、バーボタン項目が欠落しているなど)。

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

Apple が修正に取り組んでいるという噂を聞いたことがありますが、それから数か月が経過しましたが、iPad OS の更新は行われていません。おそらく iPad の OS 4 がそれに対処するでしょう。

于 2010-06-30T13:35:58.193 に答える
0

iOS5以降を搭載したiPadのUITabViewController内にUISplitViewControllerを配置することに成功しました。

長い話を短くするために:それは機能します:

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

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

プロセスの詳細は次のとおりです。

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

于 2012-12-07T22:40:11.980 に答える
0

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;

}

于 2010-08-20T00:02:44.297 に答える