我有一个UITabBarController创建programaticaly管理UIViewController的4个子类.就像是:
//Create Controller 1
self.terminal = [[[TerminalController alloc] initWithNibName:@"TerminalView" bundle:nil] autorelease];
UINavigationController* navTerminal = [[[UINavigationController alloc] initWithRootViewController:terminal] autorelease];
navTerminal.title = __(@"Terminal");
navTerminal.navigationBar.barStyle = UIBarStyleBlackOpaque;
navTerminal.tabBarItem.image = [UIImage imageNamed:@"tab_terminal.png"];
//Create Controller 2
self.history = [[[HistoryController alloc] initWithNibName:@"HistoryView" bundle:nil] autorelease];
UINavigationController* navHistory = [[[UINavigationController alloc] initWithRootViewController:history] autorelease];
navHistory.title = __(@"History");
navHistory.navigationBar.barStyle = UIBarStyleBlackOpaque;
navHistory.tabBarItem.image = [UIImage imageNamed:@"tab_history.png"];
//Create Controller 3
self.settings = [[[SettingsController alloc] initWithNibName:@"SettingsView" bundle:nil] autorelease];
UINavigationController* navSettings = [[[UINavigationController alloc] initWithRootViewController:settings] autorelease];
navSettings.title = __(@"Settings");
navSettings.navigationBar.barStyle = UIBarStyleBlackOpaque;
navSettings.tabBarItem.image = [UIImage imageNamed:@"tab_settings.png"];
//Create Controller 4
HelpController* help = [[[HelpController alloc] initWithNibName:@"HelpView" bundle:nil] autorelease];
UINavigationController* navHelp = [[[UINavigationController alloc] initWithRootViewController:help] autorelease];
navHelp.title = __(@"Help");
navHelp.navigationBar.barStyle = UIBarStyleBlackOpaque;
navHelp.tabBarItem.image = [UIImage imageNamed:@"tab_help.png"];
//Create Tab Bar an add it's view to window.
self.tabBar = [[[UITabBarController alloc] initWithNibName:nil bundle:nil] autorelease];
tabBar.viewControllers = [[[NSArray alloc] initWithObjects:navTerminal, navHistory, navSettings, navHelp, nil] autorelease];
tabBar.delegate = self;
[window addSubview:tabBar.view];
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉UITabBarController懒惰地加载视图控制器?ej,当用户点击其中一个标签栏项目或者调用tabBarController setSelectedIndex时?
zpa*_*ack 12
我在我的一个应用程序中做了这件事.诀窍是让你的视图控制器不是UITabBarController的子类,而是UIViewController,并实现UITabBarDelegate.我在IB中为此创建了视图,布置了标签栏(带有正确的按钮,图像,标签等)和占位符UIView,用于正确放置交换的子视图.视图切换发生在tabBar:didSelectItem:它看起来像这样:
// MyTabBarController.h
@class MyFirstViewController;
@class MySecondViewController;
@class MyThirdViewController;
@interface MyTabBarController : UIViewController <UITabBarDelegate> {
IBOutlet UIView *placeholderView;
IBOutlet UITabBar *tabBar;
MyFirstViewController *firstViewController;
MySecondViewController *secondViewController;
MyThirdViewController *thirdViewController;
UIViewController *currentViewController;
}
@property (nonatomic, retain) MyFirstViewController *firstViewController;
@property (nonatomic, retain) MySecondViewController *secondViewController;
@property (nonatomic, retain) MyThirdViewController *thirdViewController;
- (void) switchToView:(UIViewController*)aViewController;
@end
// MyTabBarController.m
#import "MyTabBarController.h"
#import "MyFirstViewController.h"
#import "MySecondViewController.h"
#import "MyThirdViewController.h"
enum {
kView_First = 1,
kView_Second,
kView_Third
};
@implementation MyTabBarController
@synthesize firstViewController, secondViewController, thirdViewController;
- (void) viewDidLoad {
// Default to first view.
tabBar.selectedItem = [tabBar.items objectAtIndex:0];
MyFirstViewController *viewController = [[MyFirstViewController alloc] initWithNibName:@"FirstView" bundle:nil];
self.firstViewController = viewController;
[viewController release];
[self switchToView:firstViewController];
}
- (void)viewWillAppear:(BOOL)animated {
// Tell our subview.
if( currentViewController != nil ) {
[currentViewController viewWillAppear:animated];
}
}
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
switch (item.tag) {
case kView_First: {
if (firstViewController == nil) {
MyFirstViewController *viewController = [[MyFirstViewController alloc]
initWithNibName:@"FirstView" bundle:nil];
self.firstViewController = viewController;
[viewController release];
}
[self switchToView:firstViewController];
}
break;
case kView_Second:
if (secondViewController == nil) {
MySecondViewController *viewController = [[MySecondViewController alloc]
initWithNibName:@"SecondView" bundle:nil];
self.secondViewController = viewController;
[viewController release];
}
[self switchToView:secondViewController];
break;
case kView_Third: {
if (timesViewController == nil) {
MyThirdViewController *viewController = [[MyThirdViewController alloc]
initWithNibName:@"ThirdView" bundle:nil];
self.thirdViewController = viewController;
[viewController release];
}
[self switchToView:thirdViewController];
}
break;
}
}
- (void) switchToView:(UIViewController*)aViewController {
if( aViewController == currentViewController ) return;
UIView *aView= aViewController.view;
[aViewController viewWillAppear:NO];
if( currentViewController != nil ) {
[currentViewController viewWillDisappear:NO];
[currentViewController.view removeFromSuperview];
}
aView.frame = placeholderView.frame;
[self.view insertSubview:aView aboveSubview:placeholderView];
if( currentViewController != nil ) {
[currentViewController viewDidDisappear:NO];
}
[aViewController viewDidAppear:NO];
currentViewController = aViewController;
}
@end
Run Code Online (Sandbox Code Playgroud)
代码肯定会变得更干,但你明白了.
您要延迟加载什么?
这是一个非常标准的UITabBarController实现。在我正在编写的应用程序中,我有一个与此非常相似的东西。在我的代码中,在触摸选项卡之前,不会调用viewDidLoad(在控制器将其关联的视图加载到内存后调用的方法)。
我确实相信(除了所有自动发布的对象之外)您编码的方式是创建此类UI的首选方法。
| 归档时间: |
|
| 查看次数: |
16749 次 |
| 最近记录: |