views:

1328

answers:

4

I have a tabbar based application and do the following to get a reference to the application delegate:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

Which then gives this warning:

warning: type 'id <UIApplicationDelegate>' does not conform to the 'UITabBarControllerDelegate' 

My application delegate header looks like this:

#import <UIKit/UIKit.h>

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>     {
UIWindow *window;
UITabBarController *tabBarController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;

@end

The only methods in the .m file are applicationDidFinishLaunching and dealloc. What else do I need to conform to the protocol?

A: 

If you declare MyAppDelegate as conforming to UITabBarDelegate, using <UITabBarDelegate>, then you need to implement at least the required methods of the protocol.

You should read up on how protocols work, and the differences between formal and informal protocols.

The method you need to implement to conform to the UITabBarDelegate is

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
Jasarien
+5  A: 

It's a static warning. It means that the return type of [[UIApplication sharedApplication] delegate] does not conform to the tab bar delegate protocol, which is true.

Cast the value returned from [[UIApplication sharedApplication] delegate] to get rid of the warning:

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
Darren
A: 

My opinion is that the "checked" answer to this is incorrect. I do not have enough "points" to vote it down...but casting to hide a deficiency in your implementation can come back and bite you. My vote was for "Jasarien". Conform to the UITabBarDelegate and you will not have the warning anymore.

Jann
+1  A: 

I would like to chime in because the second and third comments are technically incorrect. The error says that the AppDelegate does not conform to the UITabBarController delegate. The answers about mention the UITabBarDelegate.

Apples and Oranges.

Incidentally, the Apple sample code uses the casting method as well.

Jeff