Iphone 未调用AppDelegate中的didSelectViewController

Iphone 未调用AppDelegate中的didSelectViewController,iphone,objective-c,xcode,delegates,uitabbarcontroller,Iphone,Objective C,Xcode,Delegates,Uitabbarcontroller,这就是我告诉didFinishLaunchingWithOptions关于在storyboard中创建的选项卡栏控制器的方式。它现在在主选项卡中显示iAd横幅。但当我点击其他选项卡时,什么也不会发生。从未调用didSelectViewController。如何将didSelectViewController连接到我的TabBarController,并将currentController属性分配给当前/活动选项卡 #import "AppDelegate.h" @interface AppDe

这就是我告诉didFinishLaunchingWithOptions关于在storyboard中创建的选项卡栏控制器的方式。它现在在主选项卡中显示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;

}
#导入“AppDelegate.h”
@接口AppDelegate()
@属性(非原子,保留)ADBannerView*bannerView;
@属性(非原子,赋值)UIViewController*currentController;
@结束
@实现AppDelegate
@合成窗口=_窗口;
@综合横幅视图;
@综合电流控制器;
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
{
//应用程序启动后自定义的覆盖点
CGRect屏幕边界=[[UIScreen mainScreen]边界];
//班纳维在这里
//这是对选项卡栏控制器和故事板中第一个选项卡的引用。
UITabBarController*选项卡控制器=(UITabBarController*)self.window.rootViewController;
self.currentController=[[tabController viewControllers]objectAtIndex:0];
NSLog(@“Root:%@”,self.window.rootViewController);
NSLog(@“带标题的选项卡:%@”,self.currentController);
返回YES;
}
//这不叫:
-(无效)选项卡控制器:(UITabBarController*)选项卡控制器DIDSELECTVIEW控制器:
(UIViewController*)viewController
{
//如果要求选择同一选项卡,则不执行任何操作
如果(currentController==viewController){
返回;
}
如果(bannerView.bannerLoaded){
//如果我们有bannerView atm,告诉旧视图控制器隐藏,新视图控制器显示。
[currentController HidebanerView:bannerView];
[(UIViewController*)viewController showBannerView:bannerView];
}
//记住这个viewcontroller,以备将来使用。
self.currentController=(UIViewController*)viewController;
}

您必须将选项卡视图控制器的
委托
属性设置为
AppDelegate
,以便调用任何委托方法。

正如omz避免的那样,您需要设置
UIAbbarController的委托
-添加第三行,如下所示:

// 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
表示,“我的类AppDelegate符合uitabarcontrollerdelegate的协议”。但是,选项卡栏控制器实例还不知道您的类。因此,您必须告诉选项卡栏控制器哪个AppDelegate实例是您希望它进行回调的实例。您可以通过设置
委托
属性来实现这一点


希望这有帮助:)

如果您从x代码模板创建了一个选项卡栏应用程序;您需要在appdelegate.m中添加以下行

self.tabBarController.delegate=self;
这应该在didFinishLaunchingWithOptions方法中的下一行上方

[self.window makeKeyAndVisible];

@接口AppDelegate:UIResponder是这样的吗?这没有任何区别。在尖括号中添加协议名称只意味着您的AppDelegate符合该协议。。可以将其视为指示您的AppDelegate现在“有资格”成为选项卡栏控制器的委托。要实际设置委托属性,请执行tabController.delegate=self;创建itI之后,我看不出有任何区别,如果我按其他选项卡,即使我将self.currentController=nil,也不会发生任何事情;在didSelectViewController中。NSLog(@“%s”,函数);他没有反应。有进一步的建议吗?是的,谢谢,但我仍然没有收到DIDSelectViewControllerr的回复。您为什么要按程序执行此操作?如果您正确设置了故事板,则不需要实现“didSelectViewController”。退房-我想它可能会对你有所帮助。谢谢你,我会退房的,但它一开始工作得很好。也许我不需要didSelectViewController,但我必须告诉iAd有关currentController的信息。对我的代码有什么建议吗?您可以将
didSelectViewController
中的横幅代码移动到链接到每个选项卡的所有uiviewcontroller的
viewdide
方法中。然后,当用户选择一个选项卡,并且该视图控制器出现时,会调用
viewdideappear
,您可以在那里做您的横幅业务。谢谢,如果您想要奖金和大量代表,欢迎在这个问题上向我展示: