1

私はTabBarベースのiPhoneアプリケーションを持っています.Appデリゲートでは、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];

???

それは同じですか?それとも、アップルによって追加されたのはデフォルトですか?タブをもう 1 つ追加したい場合は、次のように記述します。

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

この場合、違いは見られません。あなたのやり方でやりたいと思います。しかし、以下のような状況では、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

1) ThirdViewController でインスタンス メソッドまたはプロパティを使用する場合は、次を使用する必要があります。

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

2)そうする必要がない場合は、使用できます

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

安全のために、最初のケースは良い習慣です。

于 2012-12-27T16:55:40.587 に答える
0

あなたは

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

アプローチ。Apple が他のアプローチを使用する理由がわかりません。この簡単な例では、違いはありません。ただし、設定したいプロパティがある場合は、クラス名を使用することをお勧めします。

于 2012-12-27T16:30:28.750 に答える
0

カスタムインターフェイスを持ちたいView Controllerがある場合は、それをUIViewControllerのサブクラスにする必要があります。ThirdViewController が UIViewController のサブクラスである場合、ここで述べたコード:

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

望ましい結果が得られます。Apple のアプローチは、プロパティを持たない一般的なビュー コントローラーのみを対象としているため、理想的には、すべてのタブを UIViewController サブクラスにする必要があります。

于 2012-12-27T16:32:13.833 に答える