2

これは、ストーリーボードで作成されたタブ バー コントローラーについて didFinishLaunchingWithOptions に伝える方法です。メインタブに iAd バナーが表示されるようになりました。しかし、他のタブをタップしても何も起こりません。didSelectViewController が呼び出されることはありません。didSelectViewController を TabBarController に接続し、現在の/アクティブなタブに currentController プロパティを割り当てるにはどうすればよいですか?

#import "AppDelegate.h"

@interface AppDelegate()

@property (nonatomic, retain) ADBannerView *bannerView;
@property (nonatomic, assign) UIViewController<BannerViewContainer> *currentController;

@end

@implementation AppDelegate

@synthesize window = _window;
@synthesize bannerView;
@synthesize currentController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch

    CGRect screenBounds = [[UIScreen mainScreen] bounds];

    // bannerView was here

    // This is the reference to the tab bar controller and first tab from storyboard.
    UITabBarController *tabController = (UITabBarController *)self.window.rootViewController;
    self.currentController = [[tabController viewControllers] objectAtIndex:0];

    NSLog(@"Root: %@", self.window.rootViewController);
    NSLog(@"Tab with banner: %@", self.currentController);

    return YES;
}

//and this isn't called:

- (void)tabController:(UITabBarController *)tabController didSelectViewController:
(UIViewController *)viewController
{
    // If called for selection of the same tab, do nothing
    if (currentController == viewController) {
        return;
        }
    if (bannerView.bannerLoaded)  {
     // If we have a bannerView atm, tell old view controller to hide and new to show.
        [currentController hideBannerView:bannerView];
        [(UIViewController<BannerViewContainer>*)viewController showBannerView:bannerView];
        }
        // And remember this viewcontroller for the future.
    self.currentController = (UIViewController<BannerViewContainer> *)viewController;

}
4

3 に答える 3

9

omz が回避したように、デリゲートを設定する必要がありますUITabBarController- 以下の 3 行目を追加します。

// This is the reference to the tab bar controller and first tab from storyboard.
UITabBarController *tabController = (UITabBarController *)self.window.rootViewController;
tabController.delegate = self;

これを行うことであなたがしたこと@interface AppDelegate : UIResponder <UIApplicationDelegate, ADBannerViewDelegate, UITabBarControllerDelegate>は、「私のクラス AppDelegate は UITabBarControllerDelegate のプロトコルに準拠しています」と言うことです。ただし、タブ バー コントローラーのインスタンスはまだクラスを認識していません。したがって、どの AppDelegate インスタンスがコールバックしたいタブ バー コントローラーかを伝える必要があります。これを行うには、プロパティを設定しdelegateます。

お役に立てれば :)

于 2012-07-29T23:01:26.243 に答える
3

x-code テンプレートからタブ バー アプリケーションを作成した場合。appdelegate.m に次の行を追加する必要があります

self.tabBarController.delegate=self;

これは、didFinishLaunchingWithOptions メソッドの次の行の上にある必要があります。

[self.window makeKeyAndVisible];
于 2013-02-15T10:17:01.327 に答える
3

デリゲート メソッドを呼び出すには、タブ ビュー コントローラーのdelegateプロパティを設定する必要があります。AppDelegate

于 2012-07-29T22:50:05.040 に答える