を定義するカスタムプロトコル
-
11-10-2019 - |
質問
いカスタムクラスです。いたい場合、その他のクラスのインスタンス化できますか"必要"ある特定の方法です。どのように実現する。いを受け継ぎが原因であることがわかってきていない追加追加する機能または変更機能します。と思ったカスタムプロトコルがどのように私のクラスを知る "できるインスタンスを生成そのもののみ定義されている場合プロトコルを実装するクラスがスをインスタンス化します。"
シナリオ
classA : base-class classB : base-class classM
は財産の種類 base-class
.私として設定 objclassA
または objclassB
. ClassA
& classB
インスタンスを生成 classM
その objclassM`` calls method
コールバックmethod which is in both
クラスa&
classB. warning in
classMベースのクラスは対応のコールバック`
@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
解決
特定のクラスが特定のプロトコルに準拠しているかどうかを確認できます
[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
他のヒント
代表者を使用してみませんか?
クラスを代表者としてインスタンス化しているオブジェクトを設定します。次に、クラスのコードで、DelegateがResponsStoselectorを呼び出して探している方法を持っているかどうかを確認できます。
[delegate respondsToSelector:@selector(yourMethod)]
ヘッダーのクラスはこのようになっているでしょう:
#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そのときに警告が表示されます。
インスタンス変数BackObjectの宣言を次のように変更します。
id <UITableViewMgrDelegate> backObject;
classaまたはclassBがuitableviewmgrdelegateに準拠していないという警告が表示された場合は、インターフェイスに追加するだけです。
@interface classA : UIViewController <UITableViewMgrDelegate>