Pregunta

Tengo una costumbre class.And quiero si cualquier otra clase instantiate que entonces " debe " tener algún método específico. ¿Cómo lograr esto? No quiero a heredar porque yo no estoy de agregar cualquier característica adicional o modificar su funcionalidad de ninguna manera. Pensé en un protocolo personalizado, pero la forma en que mi clase de saber que "Debe permitir crear una instancia de sí mismo sólo si se implementa el protocolo definido por clase es crear instancias de ella."
escenario es
classA : base-class classB : base-class classM tiene propiedad de tipo base-class. que i Establecer como objclassA o objclassB. ClassA y classB instantiate classM entonces objclassM`` calls methodcallBackmethod which is in bothclassA&classB. warning inclassM base clase puede no respuesta 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 Me deshice de esas advertencias mediante la definición de un protocolo personalizado en mi clase de esta manera


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

¿Fue útil?

Solución

Se puede comprobar si una determinada clase se ajusta a un determinado protocolo

[MyClass conformsToProtocol:@protocol(Joining)];

La introspección

Un ejemplo de la palabra real. Nota que el delegate se define id<VSKeypadViewDelegate> delegate;, lo que significa que un objeto, que está destinado a ser el delegado debe ajustarse a la VSKeypadViewDelegate protocolo

#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

Otros consejos

¿Cómo sobre el uso de un delegado?

fijaría el objeto que se instanciando su clase como su delegado. Luego, en el código de su clase, se puede comprobar para ver si el delegado tiene el método que busca llamando respondsToSelector

[delegate respondsToSelector:@selector(yourMethod)]

su clase de cabecera debería tener este aspecto:

#import "ClassA.h"
@protocol myDelegate;

@interface ClassA : UIViewController {
}
@end

@protocol myDelegate
- (void)doSomething;
@end

y ClassB algo como esto:

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

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

si utiliza <myDelegate> usted tiene que poner en práctica el método de ClassB de otro modo se obtiene una advertencia.

Cambiar la declaración de la variable de instancia backObject a:

id <UITableViewMgrDelegate> backObject;

Si recibe advertencias sobre classA o ClassB que no se ajusten a UITableViewMgrDelegate, sólo tiene que añadir a sus interfaces:

@interface classA : UIViewController <UITableViewMgrDelegate>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top