使用AppDelegate之外的NIB创建UITabBarController?

时间:2012-01-23 21:01:43

标签: xcode user-interface ios4 uitabbarcontroller

iOS编程仍然是新手,尽管进行了大量研究,但我还遇到了另一个障碍。

我想要实施的内容:

我想要一个从主UI导航时加载的UITabBarController。我还想使用NIB来定义它的属性。

我可以找到的所有示例都将UITabBarController放在AppDelegate中,但我不想加载它,除非它被使用。我也不知道如果我只是模态地执行它,所有的UIGestureRecognizer都会保持活动状态(我无法获得有效的实现)。

到目前为止我有什么

首先,我从AppDelegate加载一个初始加载视图

AppDelegate.h

@class InitialViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UIViewController *viewController;

@end

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[InitialViewController alloc] initWithNibName:@"InitialViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}

从这个视图来看,由于我只是制作UI的骨架,我有两个按钮,一个是主界面,另一个是UITabBarController。

InitialViewController.h

@interface InitialViewController : UIViewController
- (IBAction)toMain:(id)sender;
- (IBAction)toTabs:(id)sender;

@property (strong, nonatomic) UIViewController *mviewController;
@property (strong, nonatomic) UIViewController *tviewController;
@end

InitialViewController.m

- (IBAction)toMain:(id)sender {

self.mviewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
[[[UIApplication sharedApplication] delegate] window].rootViewController = self.mviewController;

}

- (IBAction)toTabs:(id)sender {
self.tviewController = [[tabViewController alloc] initWithNibName:@"tabViewController" bundle:nil];

[[[UIApplication sharedApplication] delegate] window].rootViewController = self.tviewController;

}

在加载MainViewController时,它的行为与我想要的完全一样。但是当我加载标签视图时,我在底部有一个长标签和黑色背景。我可以在viewdidload中添加内容,例如更改背景颜色,但没有链接到XIB中的选项卡的实际选项卡或视图。

我怀疑我在两个方面缺少一些东西:在标签.h中,以及与界面构建器中的链接关联的一些链接。或者设置一个新的rootViewController是不够的。

tabBarController.h

#import <UIKit/UIKit.h>

@interface iPodViewController : UITabBarController <UITabBarControllerDelegate>
@end

如果有人能指出我正确的方向和/或向我展示一个有效的实施方案,我将非常感激。

- 作为注释,当我进入tabbar.xib并使用助手编辑器时,它会打开InitialViewController.h -

1 个答案:

答案 0 :(得分:3)

与其他视图控制器(例如UITableViewController)不同,您不应该继承UITabViewController。因此,与其他视图控制器不同,您不是子类,然后使用自定义视图使子类成为nib的所有者,指向nib中的视图。

相反,对于您想要拥有UITabBarController的任何类,请在此类中添加一个简单的vanilla UITabBarController作为outlet属性。 (例如您的应用代表)。

然后创建一个nib文件并将UITabBarController对象拖到nib中。将nib的所有者设置为您要拥有标签栏控制器的类(例如,您的应用程序委托),并将您作为属性创建的插座连接到笔尖中的标签栏控制器。

@interface myTabOwningClass

    @property (strong, nonatomic) IBOutlet UITabBarController myTabBarControllerOutlet;

现在,您要创建并显示标签栏控制器,请使用以下方法:

[[NSBundle mainBundle] loadNibNamed:@"MyTabControllerNib" owner:myTabOwningClass options:nil];

这将在拥有类上初始化属性(即我们示例中的myTabBarControllerOutlet)并从nib加载标签栏控制器,包括您在笔尖中定义的每个选项卡等的所有子视图控制器。