определение пользовательского протокола - PullRequest
0 голосов
/ 18 декабря 2010

У меня есть собственный класс. И я хочу, чтобы, если какой-либо другой класс создавал его экземпляр, тогда у него " должен " был какой-то определенный метод.Как этого добиться?Я не хочу наследовать его, потому что я не добавляю никаких дополнительных функций и не изменяю их каким-либо образом.Я думал о собственном протоколе, но как мой класс узнает, что «он должен позволять создавать себя только в том случае, если определенный протокол реализуется классом, создающим его экземпляр». Сценарий
равен
classA : base-class classB : base-class classM имеетсвойство типа base-class.который я установил как objclassA или objclassB.ClassA & classB создание экземпляра classM затем objclassM`` calls method callBack 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 ]

0 голосов
/ 20 декабря 2010

Измените объявление переменной экземпляра backObject на:

id <UITableViewMgrDelegate> backObject;

Если вы получаете предупреждения о том, что classA или classB не соответствуют UITableViewMgrDelegate, просто добавьте его в их интерфейсы:

@interface classA : UIViewController <UITableViewMgrDelegate>
0 голосов
/ 18 декабря 2010

Вы можете проверить, соответствует ли определенный класс данному протоколу

[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
0 голосов
/ 18 декабря 2010

ваш класс заголовка должен выглядеть следующим образом:

#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 в противном случаеВы получаете предупреждение.

0 голосов
/ 18 декабря 2010

Как насчет использования делегата?

Вы бы задали объект, который создает экземпляр вашего класса в качестве его делегата. Затем в коде вашего класса вы можете проверить, есть ли у делегата метод, который вы ищете, вызвав responsedsToSelector

[delegate respondsToSelector:@selector(yourMethod)]
...