是否有分配UITabBarController管理的控制器属性的最佳实践?

时间:2013-07-17 07:12:42

标签: ios objective-c

假设您有一个名为UIViewController的{​​{1}}子类,并且您在BeverageViewController集合中使用此控制器的四个单独实例。您还有一个数据结构,例如,四个UITabBarController字符串对象,NSString@"Beer"@"Wine"@"Whiskey"。每个字符串对应一个@"More Whiskey"实例,该实例将在其视图中使用该字符串作为文本标签。因此,当特定BeverageViewController实例正在执行其BeverageViewController方法时,它期望使用这四个字符串之一分配一个公共属性。

当一个控制器作为viewDidLoad层次结构中的segue目标时,通常会使用UINavigationController在调用prepareForSegue:sender:之前设置此目标控制器的属性。

当控制器是viewDidLoad集合的一部分时,我一直在探索如何在viewDidLoad之前设置控制器属性。我已经确定实现一个UITabBarController的{​​{1}}方法是一种不错的方法,除非你必须知道控制器的相关选项卡索引:

UITabBarControllerDelegate

不要被愚弄:你不能使用tabBarController:shouldSelectViewController:;您无法使用委托方法- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { NSInteger index = [tabBarController.viewControllers indexOfObject:viewController]; BeverageController *controller = (BeverageController *)viewController; controller.beverageName = self.beverageNames[index]; return YES; } ,因为此方法会在tabBarController.selectedIndex之后触发。此外,您无法在控制器的tabBarController:didSelectViewController:实现中使用viewDidLoad。这三种方法看起来最为明显,但它们并不能促进上述目标。

哦,如果只有self.tabBarController.selectedIndex在控制器的viewDidLoad方法之前解雇了,那就合法了。但事实并非如此。它也不在tabBarController:didSelectViewController:之前,并且在viewDidLoad内准备视图是傻逼的。

viewWillAppear集合中设置控制器属性的最佳方法是什么,这使得人们可以在viewDidAppear方法中访问该属性,而无需放弃IB并在程序上管理UITabBarController这是我的方法吗?是实现自定义viewDidLoad并操纵其UITabBarController属性中的控制器吗?还是我错过了APIobvious?

2 个答案:

答案 0 :(得分:1)

如果您在IB中设置所有内容并且BeverageController的字符串是常量,即它们在运行时不会更改,您可以直接在IB中设置它们。

在IB的检查员中有一个名为“用户定义的运行时属性”的选项。如果您的BeverageController子类有一个名为let {s} controllerName的属性,您只需在IB中选择该VC并单击“用户定义的运行时属性”下的小加号,属性名称将为{{1} },然后选择字符串类型并输入您的值(fe“Beer”)。

如果您需要动态更改值,那么使用controllerName的方法就可以了。

答案 1 :(得分:0)

我使用application:didFinishLaunchingWithOptions:来设置我的viewControllers。从窗口获取tabBarController,然后从tabBarController获取每个viewController。

这样的事情:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
    NSAssert([tabBarController isKindOfClass:[UITabBarController class]], @"Must be a tabBarController");

    MBFirstViewController *firstVC = tabBarController.viewControllers[0];
    firstVC.foo = @"Bar";

    MBSecondViewController *secondVC = tabBarController.viewControllers[1];
    secondVC.foo = @"Baz";

    return YES;
}