ipad - 継承 - uitabbarcontroller 途中 から




TabBar(UITabBarController)のUISplitViewController? (6)

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

別の方法で問題を見ることができます:私は左の部分にフルスクリーンを持っていますテーブルの行が選択されているときにテーブルビューを持っています。 今度は、Popover内の行が選択されると、このPopover内の行は選択された行の下の左に来て(この行のみが表示されます)、選択された行から別のPopoverが出てきます。 (ブレッドクラムナビゲーションタイプ)

私は私が説明したことで私は明らかだと思う。 だから、みんなのアイデアや回避策?

私の質問で私が明確でないかどうか教えてください。

ありがとう、

Madhup


IBを使用してタブタブを作成し、タブを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;

}


OS 3.2では、スプリットビューをタブバービューとして適切にサポートしていないことに注意してください。

あなたはそれを "仕事"にすることができますが、バグがあります - 最も大きなのは、別のタブのビューで行われた方向変更がsplitviewタブビューに正しく反映されないため、ビューが画面を引き継ぐ、またはボタンの項目が欠落しているなど)。

私は、この問題のためにtabBarControllerで使用するために自分のsplitviewを作成しなければならないという結論に達しました。

私はAppleが修正作業中であるという噂を聞いていたが、数ヶ月前になってiPadのOSのアップデートは起こっていない。おそらくiPad用のOS 4がそれに対処するだろう。


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

@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つのタブのみ)が作成されます。



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

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


私は、回転メッセージを含むすべてのUISplitViewControllersに回転メッセージを適切に伝播するUITabBarControllerサブクラスを作成しました。 これにより、UISplitViewControllerの正しい内部状態が維持されます。 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




uipopovercontroller