Frage

Ich habe eine benutzerdefinierte class.And Ich möchte, wenn eine andere Klasse instantiate es dann „ muss “ einige spezifische Methode haben. Wie dies zu erreichen? Ich will nicht erben sie verursachen ich kein Extra-Feature m Hinzufügen oder seine Funktionalität in irgendeiner Weise zu verändern. Ich dachte an benutzerdefinierten Protokoll aber wie wird meine Klasse wissen, dass „sollte es erlauben, sich zu instanziiert nur, wenn definierte Protokoll nach Klasse wobei implementiert Instanziierung.“
Szenario ist
classA : base-class classB : base-class classM hat Eigenschaft des Typs base-class. die ich gesetzt, wie objclassA oder objclassB. ClassA & classB instantiate classM dann objclassM`` calls methodcallBackmethod which is in bothclassA&classB. warning inclassM Basisklasse kann nicht Antwort auf 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 habe ich aus diesen Warnungen loswerden durch eigenes Protokoll in meiner Klasse definiert auf diese Weise


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

War es hilfreich?

Lösung

Sie können überprüfen, ob eine bestimmte Klasse Konform ein bestimmtes Protokoll

[MyClass conformsToProtocol:@protocol(Joining)];

finden Sie unter Introspection

Ein Echt Wort Beispiel. Beachten Sie, dass die delegate id<VSKeypadViewDelegate> delegate; definiert ist, was bedeutet, dass ein Objekt, das das Protokoll VSKeypadViewDelegate gemeint ist, entspricht die Delegierten sein sollte

#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

Andere Tipps

Wie wäre es, einen Delegierten mit?

Sie würden das Objekt festgelegt, dass Ihre Klasse als Delegat Instanziierung. Dann im Code Ihrer Klasse, könnten Sie überprüfen, ob die Delegierten die Methode haben Sie suchen nach respondsToSelector Aufruf

[delegate respondsToSelector:@selector(yourMethod)]

Ihre Header-Klasse soll wie folgt aussehen:

#import "ClassA.h"
@protocol myDelegate;

@interface ClassA : UIViewController {
}
@end

@protocol myDelegate
- (void)doSomething;
@end

und ClassB etwas wie folgt aus:

#import "ClassB.h"
#import "ClassA.h"

@interface ClassB : UIViewController <myDelegate> {
}
@end

Wenn Sie <myDelegate> verwenden, müssen Sie die Methode in ClassB implementieren sonst eine Warnung erhalten.

Ändern Sie Ihre Deklaration der Instanzvariablen backObject an:

id <UITableViewMgrDelegate> backObject;

Wenn Sie erhalten Warnungen über classA oder classB nicht zu UITableViewMgrDelegate konformen, fügen Sie einfach es an deren Schnittstellen:

@interface classA : UIViewController <UITableViewMgrDelegate>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top