2

多くの人がすでに報告している問題があり、didSelectViewController呼び出されませんが、私の場合は時々呼び出されます。3 つのタブと 3 つのビュー コントローラーがあります。ユーザーが 2 番目または 3 番目のタブを押すたびに、何らかのコードを実行する必要があります。私の SecondViewController と ThirdViewController には次のものがあります。

UITabBarController *tabBarController = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
[tabBarController setDelegate:self];

これで、SecondViewController ですべてが正常に動作しdidSelectViewController、2 番目のタブが押されるたびに呼び出されます。また、ThirdViewController ではdidSelectViewController、3 番目のタブが押されるたびに呼び出されますが、その間に 2 番目のバーが押されていない場合にのみ呼び出されます。したがって、FirstViewController と ThirdViewController の間を行ったり来たりすると、すべて問題ありません。しかし、first->second-> third のようなパターンにdidSelectViewController入ると、ThirdViewController で呼び出されません。また、first-> third-> second-> third のように行くdidSelectViewControllerと、ThirdViewController で初めて呼び出されますが、2 回目は呼び出されません。何か案は?

4

3 に答える 3

5

あなたが何をしているのかを正確に追跡するのは難しいですが、私が理解していることから、と の間でUITabBarControllerデリゲートを前後に変更することで、タブ スイッチに応答しています。SecondViewControllerThirdViewController

それが本当なら、私はこれをしないことをお勧めします。代わりに、次のことを試すことをお勧めします。

  • 変更されないデリゲートを割り当てます。最初はアプリ デリゲートを使用できますが、専用の小さなクラスを用意した方がよいでしょう。これで、変更されないデリゲートが作成され、 へのすべての呼び出しの 100% が取得されると確信していますtabBarController: didSelectViewController:
  • SecondViewControllerデリゲートであるオブジェクトには、とThirdViewControllerインスタンスの両方への参照が必要です。Interface Builder を使用して UI を設計している場合はIBOutlet、デリゲート クラスに 2 つの を追加し、適切なインスタンスをアウトレットに接続することでこれを行うことができます。
  • デリゲートが受信すると、どちらのタブが選択されたかに応じて、通知をまたはにtabBarController: didSelectViewController:転送するだけです。SecondViewControllerThirdViewController

基本的なコード例:

// TabBarControllerDelegate.h file
@interface TabBarControllerDelegate : NSObject <UITabBarControllerDelegate>
{
}

@property(nonatomic, retain) IBOutlet SecondViewController* secondViewController;
@property(nonatomic, retain) IBOutlet ThirdViewController* thirdViewController;


// TabBarControllerDelegate.m file
- (void) tabBarController:(UITabBarController*)tabBarController didSelectViewController:(UIViewController*)viewController
{
    if (viewController == self.secondViewController)
      [self.secondViewController doSomething];
    else if (viewController == self.thirdViewController)
      [self.thirdViewController doSomethingElse];
}

編集

上記のコード例をプロジェクトに統合する方法に関するいくつかのヒント:

  • TabBarControllerDelegateも含む .xib ファイルにのインスタンスを追加します。TabBarController
  • 'のdelegateアウトレットをインスタンスに接続しますTabBarControllerTabBarControllerDelegate
  • secondViewControllerのアウトレットをTabBarControllerDelegateインスタンスSecondViewControllerに接続します
  • thirdViewControllerのアウトレットをTabBarControllerDelegateインスタンスThirdViewControllerに接続します
  • - (void) doSomethingメソッドを追加SecondViewController
  • - (void) doSomethingElseメソッドを追加ThirdViewController
  • コードが残っていないことを確認して、デリゲートSecondViewControllerThirdViewController変更してください!TabBarController

すべての設定が完了し、すべてが正常に機能するようになったら、おそらく少しクリーンアップする必要があります。

  • 通知メソッドの名前を変更し、doSomethingよりdoSomethingElse賢明なものに変更します
  • secondViewControllerコメントの議論に従った場合は、アウトレットとthirdViewControllerアウトレットも削除したいかもしれません
于 2013-07-08T19:54:10.917 に答える
0

ストーリーボードに関するこのチュートリアルを掘り下げたところ、 を使用する代わりの方法を考えましたUITabBarControllerDelegate。固執したい場合は、UITabBarControllerDelegateこの回答を無視してください。

まず、 のサブクラスを作成し、UITabBarControllerそれを と呼びましょうMyTabBarController。ストーリーボード エディターで、タブ バー コントローラーの "Class" プロパティを変更して、ストーリーボードが新しいクラスを取得するようにする必要があります。

このコードをMyTabBarController.m

- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
  if ([segue.identifier isEqualToString:@"SecondVC"])
  {
    SecondViewController* secondViewController = (SecondViewController*)segue.destinationViewController;
    [secondViewController doSomething];
  }
  else if ([segue.identifier isEqualToString:@"ThirdVC"])
  {
    ThirdViewController* thirdViewController = (ThirdViewController*)segue.destinationViewController;
    [thirdViewController doSomethingElse];
  }
}

ストーリーボード エディターで、接続する 2 つのセグエを選択し、セグエ識別子をそれぞれ「SecondVC」と「ThirdVC」に変更できるようになりましたSecondViewControllerThirdViewController

私が間違っていなければ、あなたがする必要があるのはそれだけです。

于 2013-07-09T22:55:33.587 に答える