我有基于TabBar的iPhone应用程序,在应用程序委托2中,默认视图控制器由apple初始化(如果在创建应用程序时选择tabbar base app)。
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];
答案 0 :(得分:2)
ThirdViewController
是UIViewController
的子类,因此您可以同时编写两者。但是如果您以后想要使用变量third
来调用特定于ThirdViewController
的方法,那么您应该使用
ThirdViewController *third = [ThirdViewController alloc]....];
总结:在这个简单的场景中,没有一种正确的方法可以“做到”。从这个问题中获得的重要教训(如果尚不清楚)是理解为什么您可以将ThirdViewController
实例分配给UIViewController
变量(因为子类关系)。
答案 1 :(得分:0)
您使用
ThirdViewController *third = [ThirdViewController alloc]....];
的方法。不知道为什么Apple使用其他方法。我这个简单的例子没有任何区别。但是当你想要设置属性时,最好使用类名。
答案 2 :(得分:0)
这取决于,如果您有一个想要拥有自定义接口的视图控制器,您将希望它是UIViewController的子类。如果ThirdViewController是UIViewController的子类,那么您在此处声明的代码:
ThirdViewController *third = [ThirdViewController alloc]....];
会产生预期的结果。 Apple的方法仅适用于没有任何属性的通用View Controller,因此理想情况下,您希望所有选项卡都是UIViewController子类。
答案 3 :(得分:0)
1)如果要在ThirdViewController中使用任何实例方法或属性,则必须使用
ThirdViewController *third = [ThirdViewController alloc]....];
2)如果您不需要这样做,可以使用
UIViewController *third = [ThirdViewController alloc]....]; // it'd make no difference
为了更加安全,imo,第一种情况是一种很好的做法。
答案 4 :(得分: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];