0

まず、両方のビュー コントローラーを UITabBarController デリゲートに設定しました。どちらもタブ バー コントローラーの一部です。これを行うには、次のコードを各 viewDidLoad に入れます。

self.tabBarController.delegate = self;

次に、次のデリゲート メソッドを CalculatorsViewController に追加しました。

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
[self presentCalculatorsView];
}

presentCalculators ビューは、同じビュー コントローラー内のサブビューを表示するだけです。

また、次のデリゲート メソッドを OptionsViewController に追加しました。

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {

    [self presentHomeScreen];

}

このメソッドも、viewController 内の別のサブビューを表示するだけです。

私が抱えている問題は、OptionsViewController presentHomeScreen メソッドは、CalculatorsViewController にアクセスしない場合にのみ呼び出されることです。アプリで CalculatorsViewController にアクセスし、OptionsViewController に戻ると、

[self presentHomeScreen]

呼び出されることはありません。実際、まだ CalculatorsViewController からメソッドを呼び出しているようです。NSLog ステートメントでテストしました。

あるメソッドが他のメソッドをオーバーライドする理由はありますか? または、タブ バー ボタンが、アクティブなビュー コントローラー以外の別のビュー コントローラーからコードを実行するのはなぜですか?

編集* あるビューコントローラーが他のビューコントローラーからデリゲートを「盗む」のとほとんど同じです。

4

1 に答える 1

1

self.tabBarController.delegate = self;各メソッドを呼び出すことでviewDidLoad、基本的にタブ バー コントローラーに、現在のデリゲートを破棄し、現在のビュー コントローラーをデリゲートとして使用するように指示します。

viewDidLoad通常、このメソッドは 1 回だけ呼び出されることに注意してください。(たとえば、ビュー コントローラーのビューがメモリ警告のためにアンロードされたときに再度呼び出される可能性があります。たとえば、ビュー コントローラーのビューに再度アクセスすると、loadView/awakeFromNibおよびが呼び出さviewDidLoadれます。ただし、このシナリオについては完全にはわかりません。 ) あなたのシナリオでは:

  1. 初めて OptionsViewController を開きます - タブバーコントローラーのデリゲートは OptionsViewController です
  2. 初めて CalculatorsViewController を開きます。タブ バー コントローラーのデリゲートが CalculatorsViewController になりました。
  3. OptionsViewController に戻ります - タブ バー コントローラーのデリゲートは、viewDidLoad再度呼び出されないため、まだ CalculatorsViewController です。

デリゲートを変更する必要がある場合は、代わりにviewWillAppearメソッドで行うことができます。

于 2012-10-17T03:40:38.140 に答える