假设您有一个UIViewController
名为 的子类,并且您在一个集合BeverageViewController
中使用此控制器的四个独立实例。UITabBarController
你还有一个数据结构,比如说,四个NSString
字符串对象,@"Beer"
, @"Wine"
,@"Whiskey"
和@"More Whiskey"
。每个字符串对应一个BeverageViewController
实例,该实例将使用该字符串作为其视图中的文本标签。因此,当一个特定的BeverageViewController
实例正在执行它的viewDidLoad
方法时,它期望有一个分配有这四个字符串之一的公共属性。
当在层次结构中有这样一个控制器作为 segue 目的地UINavigationController
时,通常在调用prepareForSegue:sender:
之前设置此目的地控制器的属性。viewDidLoad
viewDidLoad
当控制器是集合的一部分时,我一直在探索如何设置控制器属性UITabBarController
。我已经确定实现 aUITabBarControllerDelegate
的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
. 这三种方法似乎是最明显的,但它们并不能促进上述目标。
哦,lawd,lawd,如果只是tabBarController:didSelectViewController:
在控制器的viewDidLoad
方法之前被解雇。但事实并非如此。它也不是先于viewWillAppear
,并且准备内部的观点viewDidAppear
是愚蠢的。
在集合中设置控制器属性的最佳方法是什么UITabBarController
,使人们能够访问viewDidLoad
方法中的属性,而无需放弃 IB 并以程序方式管理UITabBarController
?是我上面的方法吗?是实现自定义UITabBarController
并操纵其viewControllers
属性中的控制器吗?还是我错过了 APIobvious?