我有一个基于tabbar的应用程序,并执行以下操作以获取对应用程序委托的引用:
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
然后发出此警告:
warning: type 'id <UIApplicationDelegate>' does not conform to the 'UITabBarControllerDelegate'
我的应用程序委托标题如下所示:
#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
.m文件中唯一的方法是applicationDidFinishLaunching和dealloc。我还需要遵守协议吗?
答案 0 :(得分:14)
这是一个静态警告。这意味着[[UIApplication sharedApplication] delegate]
的返回类型不符合标签栏委托协议,这是真的。
投射从[[UIApplication sharedApplication] delegate]
返回的值以消除警告:
MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
答案 1 :(得分:2)
如果使用<UITabBarDelegate>
将MyAppDelegate声明为符合UITabBarDelegate,则需要至少实现协议所需的方法。
您应该了解协议如何工作,以及正式和非正式协议之间的差异。
您需要实现以符合UITabBarDelegate的方法是
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
答案 2 :(得分:1)
我想插话,因为第二和第三条评论在技术上是不正确的。该错误表明AppDelegate不符合UITabBarController委托。关于提到UITabBarDelegate的答案。
苹果和橘子。
顺便提一下,Apple示例代码也使用了转换方法。
答案 3 :(得分:0)
“顺便提一下,Apple示例代码也使用了强制转换方法。” - 杰夫 我认为这不是偶然的。 错误来了,因为委托属性是id“UIApplicationDelegate”,但是因为他将它分配给MyAppDelegate而获得警告,这不仅符合UIApplicationDelegate而且符合UITabBarControllerDelegate。这就是为什么,如果一个人介绍演员 MyAppDelegate appDelegate =(MyAppDelegate )[[UIApplication sharedApplication] delegate]; 它运作正常。