初始化自定义UIViewController

时间:2012-12-27 16:26:12

标签: iphone objective-c uiviewcontroller initialization

我有基于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];

5 个答案:

答案 0 :(得分:2)

ThirdViewControllerUIViewController的子类,因此您可以同时编写两者。但是如果您以后想要使用变量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];