2010-12-18 170 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>