0

我有一个自定义类。我希望如果有任何其他类实例化它,那么它“必须”有一些特定的方法。如何做到这一点?我不想继承它,因为我没有添加任何额外的功能或以任何方式修改它的功能。我想到了自定义协议,但我的班级如何知道“只有当定义的协议由正在实例化它的类实现时,它才应该允许实例化自己。”
场景
classA : base-class classB : base-class classM具有 type 的属性base-class。我设置为objclassAor objclassBClassA&classB实例化classM然后objclassM`` calls method回调 classA method which is in bothclassB &classM. warning in基类可能不响应回调`


@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:'

谢谢ssssss我通过在我的类中定义自定义协议来摆脱这些警告


@protocol UITableViewMgrDelegate
@required
-(void)tableRowSelected:(int)idd selectedType:(NSString*)selectedType selectedValue:(NSString*)selectedValue;
@optional 
- (void)AddList:(NSString*)value isNew:(int)isNew;
@end

4

4 回答 4

0

将实例变量 backObject 的声明更改为:

id <UITableViewMgrDelegate> backObject;

如果你收到关于 classA 或 classB 不符合 UITableViewMgrDelegate 的警告,只需将其添加到它们的接口中:

@interface classA : UIViewController <UITableViewMgrDelegate>
于 2010-12-20T06:38:42.103 回答
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 中实现该方法,否则会收到警告。

于 2010-12-18T16:44:19.913 回答
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
于 2010-12-18T08:40:40.227 回答
0

使用委托怎么样?

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

[delegate respondsToSelector:@selector(yourMethod)]
于 2010-12-18T08:23:33.540 回答