0

カスタムクラスがあります。他のクラスがそれをインスタンス化する場合は、特定のメソッドが「必要」です。これを達成する方法は?私はそれを継承したくありません。なぜなら、私は余分な機能を追加したり、その機能を変更したりしないからです。カスタムプロトコルについて考えましたが、クラスが「インスタンス化するクラスによって定義されたプロトコルが実装されている場合にのみ、それ自体をインスタンス化できるようにする必要がある」ことをクラスはどのように知るのでしょうか。
シナリオには
classA : base-class classB : base-class classM、タイプのプロパティがありますbase-classobjclassAまたはとして設定しobjclassBます。ClassAclassBインスタンス化してclassMからobjclassM`` calls methodcallBack method which is in bothclassA &classBclassMbase . warning in-classが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:'

ありがとうsssssssこのようにクラスでカスタムプロトコルを定義することにより、これらの警告を取り除きました


@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

特定のクラスが特定のプロトコルに準拠しているかどうかを確認できます

[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 に答える
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

インスタンス変数backObjectの宣言を次のように変更します。

id <UITableViewMgrDelegate> backObject;

classAまたはclassBがUITableViewMgrDelegateに準拠していないという警告が表示された場合は、それらをインターフェイスに追加するだけです。

@interface classA : UIViewController <UITableViewMgrDelegate>
于 2010-12-20T06:38:42.103 に答える