2010-12-18 168 views
0

我有一个自定义的类。而且我想如果有其他类实例化它,那么它“必须”有一些具体的方法。 如何做到这一点? 我不想继承它,因为我没有添加任何额外的功能或以任何方式修改其功能。 我想到自定义协议,但我的班级如何知道“它应该允许实例化自己,只有当定义的协议是通过实例化类来实现的。”
场景是
classA : base-class classB : base-class classMbase-class类型的财产。我设置为objclassAobjclassBClassA & 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 
 
驱除掉这些警告
+0

我想没有看你的代码,他不能真正帮助你。 – vikingosegundo 2010-12-18 09:16:24

+0

我应该发布什么部分代码? – saurabh 2010-12-18 09:34:37

+0

发布您遇到问题的代码块。 – EmptyStack 2010-12-18 09:55:20

回答

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 
+0

它会摆脱警告“对象可能不响应”methodname“”当我建立? – saurabh 2010-12-18 08:46:47

+0

看到我贴的代码 – vikingosegundo 2010-12-18 08:47:25

+0

看到这个代码在行动:https://github.com/vikingosegundo/KeyPad – vikingosegundo 2010-12-18 08:54:17

0

如何使用委托?

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

[delegate respondsToSelector:@selector(yourMethod)] 
+0

okyeee ...我想到委托,但苹果说它是用来处理用户交互,所以我切换到协议。目前我所做的是设置一个对象(即实例化我的关注类)作为类的属性和调用该对象的方法。它显然有效,但它给了我警告:可能不响应“方法名称”如果我按你的方式。会摆脱那些警告? – saurabh 2010-12-18 08:42:51

+0

@saurabh:您必须在头文件中定义方法。检查你有没有? – EmptyStack 2010-12-18 08:43:48

+0

场景是classA:基类classB:基类classM具有基类类型的属性。 ClassA和classB实例化classM,然后objclassM调用classA和classB中的方法callBack方法。警告在classM基础类可能不响应回调呼叫返回 – saurabh 2010-12-18 08:57:56

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>你必须在Cl中实现该方法assB,否则你会收到警告。

0

更改您的实例变量backObject的声明:

id <UITableViewMgrDelegate> backObject; 

如果你得到关于CLASSA或ClassB的警告,不符合UITableViewMgrDelegate,只需将其添加到他们的接口:

@interface classA : UIViewController <UITableViewMgrDelegate>