我有一个相对常见的TabBarController设置,其选项卡包含以TableViewControllers为根的NavigationControllers。我正在尝试在其中一个TableViewControllers的初始化上执行一些逻辑,但似乎无法找到调用的init函数。
我的目标是在TableViewController(我有子类)中添加一个侦听器,它可以通过更新navigationController.tabBarItem.badgeVluew属性来响应事件。
我已经尝试将代码放入initWithStyle:以及init但它们都不会被调用。我也尝试将它放在viewDidLoad中,但是只有在控制器实际出现时才会调用它(我需要在加载控制器后立即执行它/一旦标签栏项目显示出来)。
有没有人知道在控制器初始化时我会把这个代码放在哪里?
此外,这都是通过界面构建器/ NIB设置的。我没有手动添加导航控制器或tableviewcontroller,这就是为什么我不清楚我需要覆盖哪些init函数。
答案 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;',等等。试试吧
希望这有帮助!