Domanda

Ho un personalizzato class.And voglio se qualsiasi altra classe un'istanza allora " deve " avere qualche metodo specifico. Come raggiungere questo obiettivo? Non voglio in possesso di questo perché io non sto aggiunta di qualsiasi caratteristica in più o modificando la sua funzionalità in alcun modo. Ho pensato di protocollo personalizzato, ma come sarà la mia classe sapere che "dovrebbe permettere di creare un'istanza di se stesso solo se protocollo definito è implementato per classe di essere un'istanza di esso."
scenario è
classA : base-class classB : base-class classM ha proprietà di tipo base-class. che ho impostato come objclassA o objclassB. ClassA & classB instantiate classM poi objclassM`` calls methodcallBackmethod which is in bothclassA&classB. warning inclassM classe base potrebbe non risposta a 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 mi sono liberato fuori quei avvertimenti definendo protocollo personalizzato nella mia classe di questo modo


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

È stato utile?

Soluzione

È possibile verificare se un certo conforme della classe di un determinato protocollo

[MyClass conformsToProtocol:@protocol(Joining)];

Introspezione

Un esempio concreto di parola. Si noti che il delegate è definita id<VSKeypadViewDelegate> delegate;, ciò significa che un oggetto, che è destinata ad essere delegato dovrebbe essere conforme al protocollo 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

Altri suggerimenti

Come sull'utilizzo di un delegato?

Si potrebbe impostare l'oggetto che è un'istanza di vostra classe come suo delegato. Poi, nel codice della tua classe, si potrebbe verificare se il delegato ha il metodo che si sta cercando chiamando respondsToSelector

[delegate respondsToSelector:@selector(yourMethod)]

la classe di intestazione dovrebbe assomigliare a questo:

#import "ClassA.h"
@protocol myDelegate;

@interface ClassA : UIViewController {
}
@end

@protocol myDelegate
- (void)doSomething;
@end

e ClassB qualcosa di simile:

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

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

se si utilizza <myDelegate> si deve implementare il metodo in ClassB altrimenti si ottiene un messaggio di avviso.

Cambia la tua dichiarazione della variabile di istanza backObject a:

id <UITableViewMgrDelegate> backObject;

Se si riceve avvertimenti circa classA o ClassB non conforme alle UITableViewMgrDelegate, basta aggiungerlo alla loro interfacce:

@interface classA : UIViewController <UITableViewMgrDelegate>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top