在TabBarController中的NavController下初始化ViewController

时间:2010-10-26 16:38:37

标签: iphone ios uinavigationcontroller uitabbarcontroller uitableview

我有一个相对常见的TabBarController设置,其选项卡包含以TableViewControllers为根的NavigationControllers。我正在尝试在其中一个TableViewControllers的初始化上执行一些逻辑,但似乎无法找到调用的init函数。

我的目标是在TableViewController(我有子类)中添加一个侦听器,它可以通过更新navigationController.tabBarItem.badgeVluew属性来响应事件。

我已经尝试将代码放入initWithStyle:以及init但它们都不会被调用。我也尝试将它放在viewDidLoad中,但是只有在控制器实际出现时才会调用它(我需要在加载控制器后立即执行它/一旦标签栏项目显示出来)。

有没有人知道在控制器初始化时我会把这个代码放在哪里?

此外,这都是通过界面构建​​器/ NIB设置的。我没有手动添加导航控制器或tableviewcontroller,这就是为什么我不清楚我需要覆盖哪些init函数。

1 个答案:

答案 0 :(得分:1)

如果你在IB中选择了一个UITabBarItems,你会看到'View from loaded from“YourView”'。点击此“灰色”视图。在Inspector窗口中,您将在Attributes选项卡(左侧的选项卡)中看到要加载的标题和NIB名称(将其称为“YourNibName”)。

现在选择检查器的右侧选项卡(Identity)并将Classname(Class旁边的Combo)更改为您必须在xcode中创建的“YourViewController”类。不要使用已经选择的标准ViewController。 InterfaceBuilder加载你的笔尖并将它附加到你的ViewController。

打开YourNibName并将FilesOwner的Class(Inspector,右Tab)更改为“YourViewController”。

您的TabBar的NIB也包含FilesOwner。为此FilesOwner创建一个ViewController并将其Class设置为此Controller(即TabBarController)

在“TabBarController”中,您可以找到使用此代码选择的选项卡:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{

if ([viewController.nibName isEqualToString:@"NIBName1"]){

    // Do something here, if you like. (i.e. Save the state in a string or int)
}

if ([viewController.nibName isEqualToString:@"NIBNAme2"]){

    // Do something here, if you like. (i.e. Save the state in a string or int)
}

...
}

在这里你可以做一些“全局”或预先初始化的东西。这是你可以做的一件事。

你的观点:

如果您选择了一个标签,并且第一次显示视图(由YourViewController处理),将在“YourViewController”中调用“viewDidLoad”

- (void)viewDidLoad {

// Here you can add views programatically
[self.view addSubview:myNavigationController.view];
[self.view bringSubviewToFront:myNavigationController.view];

    // And if you like, do some INIT here


[super viewDidLoad];

}

我希望这就是你的问题所在。

现在关于徽章的事情。这是一个黑客,但对我来说很好。

标题文件:

在控制器中添加一个插座,代表您的TabBarController:

@interface yourController : UIViewController <UITabBarControllerDelegate> {

    UITabBarController *tabBarController;   
}

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;

@end

将IB中的此插座与TabBar连接。

实现:

在你的TabBarControllerClass中,你可以覆盖'initWithNibName':

@synthesize tabBarController;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {

        // Do some init here

        // select your desired item (it will be loaded)
        // then you can assign the badge
        tabBarController.selectedIndex = 1;
    tabBarController.selectedViewController.tabBarItem.badgeValue = @"222";

            // and select the item you will start with
    tabBarController.selectedIndex = 0;

// if you like you can add a notification, which you can activate from anywhere else
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(itemBadgeChanged:)
                                             name:@"itemBadgeChangedNotification"
                                           object:nil];
}
    return self;
}

如果您不使用nib,请使用' - (void)loadView {...}'代替。 您正在使用TabBar控制器的子类,也许您可​​以使用'self.selectedIndex = 1;'而不是'tabBarController.selectedIndex = 1;',等等。试试吧

希望这有帮助!