3

誰かがタブを切り替えたときにイベントをキャッチしたい。appdelegate ファイルに次の 2 つの関数があります。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UITabBarController * uitbc = [storyboard instantiateViewControllerWithIdentifier:@"tabbarcontroller"];
    uitbc.delegate = self;
    [self.window addSubview:uitbc.view];

    return YES;
}


- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    NSLog(@"switching");
}

しかし、NSLog(@"switching");決して発火しません。uitbc.delegate = self;xcode は、 「互換性のない型 ID のパラメーターに appdelegate const__strong を渡す」という行に対して警告を発行します。

私は何を間違っていますか?tabbarcontrollerフォームストーリーボードをインスタンス化していることを除いて、ここで見つかった受け入れられた回答に従っています:

iPhoneでタブメニューを切り替えるイベントを取得する方法

更新 skram の提案に基づいて、appdelegate 用にこれを書きましたが、NSLOG(Switching) はまだ起動しません。

@interface johnAppDelegate : UIResponder <UITabBarControllerDelegate>

また、didFinishLauchingWithOptions を更新しました。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
tabBarController = self.window.rootViewController.tabBarController;
tabBarController.delegate = self;
[window addSubview:tabBarController.view];
}

良いことは、何もクラッシュしないことです。また、互換性のない型に関する警告も表示されなくなりました。それでも、didSelectViewController は起動しません。

4

3 に答える 3

4

私のappdelegate.hファイルで、行を変更しました

@interface wscAppDelegate : UIResponder <UIApplicationDelegate>

@interface wscAppDelegate : UIResponder <UIApplicationDelegate,UITabBarControllerDelegate>

次に、viewDidLoad 関数の CustomTabBarController に次の行を追加しました。

wscAppDelegate *appDelegate = (wscAppDelegate *)[[UIApplication sharedApplication] delegate];
self.delegate = appDelegate;

次に、 appdelegate.m ファイルに、この関数を追加しました

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

NSLog(@"hooray this works");

}
于 2012-06-06T00:45:17.720 に答える
2

私もこれに苦労しましたが、私の UITabBarNavigationController はそこに設定する AppDelegate からかなり離れており、実際に機能させる唯一の方法は、 UITabBarController サブクラス自体の viewDidLoad ではなく、その中でそれを行うことでした:

-(void)viewDidLayoutSubviews {
    [ super viewDidLayoutSubviews ];
    self.delegate = self;
}

そして、それはそれを解決しました。または、タブバーで制御されたビューコントローラーのいずれかで実行できますが、それは間違っているように感じます.

于 2013-10-07T07:39:43.587 に答える
0

プロトコルに準拠するには AppDelegate が必要UITabBarControllerDelegateです。下記参照..

@interface YourAppDelegate : UIResponder <UITabBarControllerDelegate>
于 2012-06-05T03:40:12.567 に答える