定义自定义协议

时间:2010-12-18 08:18:12

标签: iphone objective-c custom-protocol

我有一个自定义类。我希望如果任何其他类实例化它,那么“必须”有一些特定的方法。 怎么做到这一点? 我不想继承它,因为我没有添加任何额外功能或以任何方式修改其功能。 我想到了自定义协议,但是我的班级怎么会知道“它应该允许实例化自己,只要定义的协议是由实例化它的类实现的。”
情景是 classA : base-class classB : base-class classM具有base-class类型的属性。我设置为objclassAobjclassBClassA& 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 :(得分:0)

如何使用委托?

您可以将实例化类的对象设置为其委托。然后,在您的类的代码中,您可以通过调用respondsToSelector来检查委托是否具有您要查找的方法

[delegate respondsToSelector:@selector(yourMethod)]

答案 1 :(得分:0)

您可以检查某个类是否符合给定的协议

[MyClass conformsToProtocol:@protocol(Joining)];

请参阅Introspection

一个真实的例子。请注意,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>