0

まだ解決策を思いつくことができなかったという興味深い問題があります。

私の問題は、メイン ビュー コントローラーに tabBarController を作成したことです。ユーザーがいずれかをクリックすると、対応するビュー コントローラーが呼び出され、[startFetchingFromServer] メソッドでサーバーからデータがフェッチされます。ただし、「UIViewcontroller は startFetching メソッドを宣言しています」というエラーが表示されます。

h.ファイルで

@property (nonatomic, retain) IBOutlet UITabBarController *opponentInfoTabBarController;

m.ファイルで

if((opponentInfoTabBarController.selectedViewController == objOpponentInfoSettingsViewController) || (opponentInfoTabBarController.selectedViewController == objOpponentInfoBuddiesViewController))
    {
        [opponentInfoTabBarController.selectedViewController startFetchingFromServer];
    }
4

1 に答える 1

1

1) 選択したViewControllers (objOpponentInfoSettingsViewController.h および objOpponentInfoBuddiesViewController.h) のヘッダー ファイルで startFetchingFromServer が宣言されていることを確認します。

2) SelectedViewController を適切なクラスにキャストします。これは UIViewController であるため、カスタム クラスを調べたいときに、コンパイラは UIViewController.h で startFetchingFromServer メソッドの宣言を探します。

if(opponentInfoTabBarController.selectedViewController == objOpponentInfoSettingsViewController)
    {
        (objOpponentInfoSettingsViewController *)[opponentInfoTabBarController.selectedViewController startFetchingFromServer];
    }
 else if(opponentInfoTabBarController.selectedViewController == objOpponentInfoBuddiesViewController)
    {
        (objOpponentInfoBuddiesViewController *)[opponentInfoTabBarController.selectedViewController startFetchingFromServer];
    }

お役に立てれば!

編集: selectedViewController が特定のクラスであるかどうかを確認することをお勧めします。

if(opponentInfoTabBarController.selectedViewController isKindOfClass: [OpponentInfoSettingsViewController class])
    {
        (OpponentInfoSettingsViewController *)[opponentInfoTabBarController.selectedViewController startFetchingFromServer];
    }
 else if(opponentInfoTabBarController.selectedViewController isKindOfClass: [OpponentInfoBuddiesViewController class])
    {
        (OpponentInfoBuddiesViewController *)[opponentInfoTabBarController.selectedViewController startFetchingFromServer];
    }

このように、「startFetchingFromServer」メソッドを呼び出すためだけに、インスタンスへのグローバル参照を維持する必要はありません。

呼び出す前に「startFetchingFromServer」セレクターのチェックを追加することで、このコードのチャンクをより堅牢にすることができます。

何かのようなもの:

   if ([theViewController respondsToSelector:@selector(startFetchingFromServer)]){
       [theViewController startFetchingFromServer];
   }
于 2013-04-27T18:06:25.237 に答える