0

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

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

viewDidLoad当控制器是集合的一部分时,我一直在探索如何设置控制器属性UITabBarController。我已经确定实现 aUITabBarControllerDelegatetabBarController: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?

4

2 回答 2

1

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

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

如果您需要动态更改值,您的方法tabBarController:shouldSelectViewController:很好。

于 2013-07-17T08:04:34.063 回答
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;
}
于 2013-07-17T07:39:27.310 回答