假设您有一个名为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?
答案 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;
}