1

我有基于 TabBar 的 iPhone 应用程序,并且在应用程序委托中 2 个默认视图控制器由苹果初始化(如果您在创建应用程序时选择标签栏基础应用程序)。

UIViewController *rootViewController = [[tabBarBetFirstViewController alloc] initWithNibName:@"tabBarBetFirstViewController" bundle:nil];
UIViewController *accountViewController = [[tabBarBetSecondViewController alloc] initWithNibName:@"tabBarBetSecondViewController" bundle:nil];

为什么它没有像这样初始化:

tabBarBetFirstViewController *rootViewController = [[tabBarBetFirstViewController alloc] initWithNibName:@"tabBarBetFirstViewController" bundle:nil];
tabBarBetSecondViewController *accountViewController = [[tabBarBetSecondViewController alloc] initWithNibName:@"tabBarBetSecondViewController" bundle:nil];

???

那是一样的吗?还是只是苹果添加的那些默认值?如果我想再添加一个标签,我会写:

UIViewController *third = [ThirdViewController alloc].....];

或者

ThirdViewController *third = [ThirdViewController alloc]....];

当然最后我有:

self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:rootViewController, accountViewController, third, nil];
4

5 回答 5

2

ThirdViewController是 的子类UIViewController,所以你可以两者都写。但是,如果您以后想使用该变量third来调用特定于 的方法ThirdViewController,那么您应该使用

ThirdViewController *third = [ThirdViewController alloc]....];

总结一下:在这个简单的场景中,没有一种正确的“做”方式。从这个问题中吸取的重要教训(如果还不清楚的话)是理解为什么可以将ThirdViewController实例分配给UIViewController变量(因为子类关系)。

于 2012-12-27T16:32:24.053 回答
0

1)如果你想在你的 ThirdViewController 中使用任何实例方法或属性,那么你必须使用

ThirdViewController *third = [ThirdViewController alloc]....];

2)如果您不需要这样做,您可以使用

UIViewController *third = [ThirdViewController alloc]....]; // it'd make no difference

为了更安全,imo,第一种情况是一种很好的做法。

于 2012-12-27T16:55:40.587 回答
0

在这种情况下,我看不出有什么区别,我宁愿按照你的方式去做。但在类似于以下情况的情况下,Apple 的方式似乎更好:

UIViewController *vc;

if ( some_case ){

    vc = [YourViewController1 alloc]// ...;
    [ (YourViewController1 *) vc doSomeThing]; // You might need to use casting for instance messages
    //...
}

else {

    vc = [YourViewController2 alloc]//...;
}

[self.navigationController pushViewController:vc animated:YES];
[vc release];
于 2012-12-27T16:58:37.007 回答
0

您使用

ThirdViewController *third = [ThirdViewController alloc]....];

方法。不知道为什么 Apple 使用另一种方法。我这个简单的例子没有任何区别。但是,当您有要设置的属性时,最好使用类名。

于 2012-12-27T16:30:28.750 回答
0

这取决于,如果您有一个想要自定义界面的视图控制器,您将希望它成为 UIViewController 的子类。如果 ThirdViewController 是 UIViewController 的子类,那么您在此处所述的代码:

ThirdViewController *third = [ThirdViewController alloc]....];

会产生预期的结果。Apple 的方法仅适用于没有任何属性的通用 View Controller,因此理想情况下,您希望所有选项卡都是 UIViewController 子类。

于 2012-12-27T16:32:13.833 回答