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つのタブのみ)が作成されます。
スプリットビューコントローラを既存のタブバーインターフェイスに後付けする方法については、私の記事をhttp://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uisplitviewcontroller.html : http://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uisplitviewcontroller.html : http://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uisplitviewcontroller.html
私は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