Я имею основанное на панели вкладок приложение и делаю следующее для получения ссылки на делегата приложения:
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. Чему еще я должен приспособить протоколу?
Это статическое предупреждение. Это означает, что возвращаемый тип [[UIApplication sharedApplication] делегата]
не соответствует протоколу делегата табуляции, что верно.
Выведите значение, возвращаемое делегатом [[UIApplication sharedApplication]]
, чтобы избавиться от предупреждения:
MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
Если вы объявляете MyAppDelegate как соответствующий UITabBarDelegate, используя
, то вам необходимо реализовать как минимум необходимые методы протокола.
Вы должны прочитать о том, как работают протоколы, и о различиях между формальными и неформальными протоколами.
Для соответствия UITabBarDelegate вам нужно реализовать метод
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
Я хотел бы вмешаться, потому что второй и третий комментарии технически некорректны. Ошибка говорит о том, что AppDelegate не соответствует делегату UITabBarController. В ответах о UITabBarDelegate упоминается.
Яблоки и апельсины.
Кстати, в примере кода Apple также используется метод приведения.