我有一个自定义类。我希望如果任何其他类实例化它,那么“必须”有一些特定的方法。
怎么做到这一点?
我不想继承它,因为我没有添加任何额外功能或以任何方式修改其功能。
我想到了自定义协议,但是我的班级怎么会知道“它应该允许实例化自己,只要定义的协议是由实例化它的类实现的。”
情景是
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
答案 0 :(得分:0)
如何使用委托?
您可以将实例化类的对象设置为其委托。然后,在您的类的代码中,您可以通过调用respondsToSelector来检查委托是否具有您要查找的方法
[delegate respondsToSelector:@selector(yourMethod)]
答案 1 :(得分:0)
您可以检查某个类是否符合给定的协议
[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
答案 2 :(得分:0)
你的标题类应如下所示:
#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中实施该方法,否则会收到警告。
答案 3 :(得分:0)
将实例变量backObject的声明更改为:
id <UITableViewMgrDelegate> backObject;
如果您收到有关classA或classB不符合UITableViewMgrDelegate的警告,只需将其添加到其接口:
@interface classA : UIViewController <UITableViewMgrDelegate>