我有一个视图控制器类,它必须实现几个协议。保持整洁我习惯于将每个协议的方法放在视图控制器类的一个类别中。
这一次,链接器警告我类没有实现其中一个协议。方法在运行时确实有效,链接器似乎无法识别类别中的实现。
我在一个不同的项目中简化了类,在同一个地方得到了相同的错误。
类标题:
#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
@interface TopVC : UIViewController
<
UINavigationControllerDelegate,
ABPeoplePickerNavigationControllerDelegate
>
{}
@end
topvc.m(未显示)是自动生成的,没有任何更改。这个
UINavigationControllerDelegate
协议方法实现在以下类别中:
#import <Foundation/Foundation.h>
#import "TopVC.h"
@interface TopVC (UINavigationControllerDelegate)
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
@end
#import "TopVC+UINavigationControllerDelegate.h"
@implementation TopVC (UINavigationControllerDelegate)
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
NSLog(@"navigationController:willShowViewController:animated:");
}
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
NSLog(@"navigationController:didShowViewController:animated:");
}
@end
链接器不会抱怨此类别中的此方法。但是,如果我尝试一个类别来实现
ABPeoplePickerNavigationControllerDelegate
协议以同样的方式抱怨:
#import "TopVC.h"
@interface TopVC (ABPeoplePickerNavigationControllerDelegate)
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker;
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person;
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier;
@end
#import "TopVC+ABPeoplePickerNavigationControllerDelegate.h"
@implementation TopVC (ABPeoplePickerNavigationControllerDelegate)
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
return YES;
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
return YES;
}
@end
链接器抱怨:
warning: incomplete implementation of class 'TopVC'
warning: method definition for '-peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:' not found
warning: method definition for '-peoplePickerNavigationController:shouldContinueAfterSelectingPerson:' not found
warning: method definition for '-peoplePickerNavigationControllerDidCancel:' not found
warning: class 'TopVC' does not fully implement the 'ABPeoplePickerNavigationControllerDelegate' protocol
我能看到的唯一区别是
飞机操纵员
协议方法都是可选的,而
abpeoplepickernavigationcontrollerdelegate
都是必需的。
然而,即使链接器抱怨,这些方法仍然在运行时被调用。我只是拒绝建造一个有警告的建筑。我显然漏掉了什么东西,或者在某个地方犯了一个小错误,但我看不出来。