Определение пользовательского протокола
У меня есть собственный класс. И я хочу, если какой-либо другой класс создает его экземпляр, тогда он "должен" иметь какой-то определенный метод. Как этого добиться? Я не хочу наследовать его, потому что я не добавляю никаких дополнительных функций и не изменяю их каким-либо образом. Я думал о собственном протоколе, но как мой класс узнает, что "он должен позволять создавать себя только в том случае, если определенный протокол реализуется классом, создающим его экземпляр".
сценарийclassA : base-class classB : base-class classM
имеет свойство типа base-class
, который я установил как objclassA
или же objclassB
, ClassA
& classB
иллюстрировать примерами classM
затем objclassM`` calls method
Перезвонитеmethod which is in both
CLASSA&
ClassB. warning in
classM базовый класс может не отвечать на callBack`
@protocol UITableViewMgrDelegate
@required
-(void)tableRowSelected:(int)idd selectedType:(NSString*)selectedType selectedValue:(NSString*)selectedValue;
@end
@interface UITableViewMgr : UIViewController {
NSMutableArray *dataSo,*IDs;
NSMutableArray *dataSoRight;
UIViewController *backObject;
}
in .m
[backObject tableRowSelected:(NSInteger)[indexPath row] selectedType:[NSString stringWithFormat:@"cell"] selectedValue:[NSString stringWithFormat:@"cell"]];
//warning at this line
// 'UIViewController' may not respond to '-tableRowSelected:selectedType:selectedValue:'
thankssssssss Я избавился от этих предупреждений, определив собственный протокол в своем классе таким образом
@protocol UITableViewMgrDelegate
@required
-(void)tableRowSelected:(int)idd selectedType:(NSString*)selectedType selectedValue:(NSString*)selectedValue;
@optional
- (void)AddList:(NSString*)value isNew:(int)isNew;
@end
4 ответа
Вы можете проверить, соответствует ли определенный класс данному протоколу.
[MyClass conformsToProtocol:@protocol(Joining)];
см. Самоанализ
редактировать
Пример из реальных слов. Обратите внимание, что delegate
определено id<VSKeypadViewDelegate> delegate;
что означает, что объект, который должен быть делегатом, должен соответствовать протоколу VSKeypadViewDelegate
#import <UIKit/UIKit.h>
@protocol VSKeypadViewDelegate
@required
-(int)numberOfRows;
-(int)numberOfColumns;
-(NSString*)titleForButtonOnRow:(int)row andColumn:(int)column;
-(id)valueForButtonOnRow:(int)row andColumn:(int)column;
-(CGSize)sizeForButtonOnRow:(int)row andColumn:(int)column;
-(void)receivedValue:(id)value;
-(CGPoint)keypadOrigin;
@optional
-(NSArray *)additionalButtonsForKeypad;
//-(UIColor *)keypadBackgroundColor;
//-(UIColor *)keyBackgroundColorForRow:(int)row andColumn:(int)Column;
-(UIImage *)backgroundImageForState:(UIControlState)state forKeyAtRow:(int)row andColumn:(int)column;
-(BOOL)isButtonEnabledAtRow:(int)row andColumn:(int)column;
@end
@interface VSKeypadView : UIView {
id<VSKeypadViewDelegate> delegate;
NSArray *keypadButtons;
}
+ (VSKeypadView *)keypadViewWithFrame:(CGRect)r;
- (id)initWithFrame:(CGRect)r ;
-(void)fireKeypadButton:(id)sender;
@property(nonatomic, assign) id<VSKeypadViewDelegate> delegate;
@end
Измените объявление переменной экземпляра backObject на:
id <UITableViewMgrDelegate> backObject;
Если вы получаете предупреждения о том, что classA или classB не соответствуют UITableViewMgrDelegate, просто добавьте их в их интерфейсы:
@interface classA : UIViewController <UITableViewMgrDelegate>
Ваш класс заголовка должен выглядеть так:
#import "ClassA.h"
@protocol myDelegate;
@interface ClassA : UIViewController {
}
@end
@protocol myDelegate
- (void)doSomething;
@end
и ClassB примерно так:
#import "ClassB.h"
#import "ClassA.h"
@interface ClassB : UIViewController <myDelegate> {
}
@end
если вы используете <myDelegate>
Вы должны реализовать метод в ClassB, в противном случае вы получите предупреждение.
Как насчет использования делегата?
Вы должны установить объект, который создает экземпляр вашего класса в качестве его делегата. Затем, в коде вашего класса, вы можете проверить, есть ли у делегата метод, который вы ищете, вызвав responsedsToSelector.
[delegate respondsToSelector:@selector(yourMethod)]