How to conform to UITabBarControllerDelegate
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;
UITabBarC开发者_JS百科ontroller *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?
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];
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
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.
"Incidentally, the Apple sample code uses the casting method as well." - Jeff
I think that it is not incidentally.
Error comes, because delegate property is id "UIApplicationDelegate", however one obtains warning because he assign it to MyAppDelegate, which is not only conforms to UIApplicationDelegate but also UITabBarControllerDelegate. That is why, if one introduces cast
MyAppDelegate appDelegate = (MyAppDelegate)[[UIApplication sharedApplication] delegate];
it works properly.
精彩评论