Ho un piccolo enigma che mi sta facendo impazzire. Uso la delega in modo piuttosto pesante come uno schema in un'applicazione che sto scrivendo. Sto cercando di essere "attento" nel codice chiamando il delegato il più possibile testando il delegato con "[delegate respondsToSelector]" su ogni chiamata delegata. Tutto funziona bene a meno che non sia in una sottoclasse UIView. In tal caso, respondsToSelector restituisce NO, ma posso tranquillamente chiamare il codice delegato così chiaramente esiste e funziona correttamente.Perché respondsToSelector non funziona per me in questo caso?
L'ho ridotto all'esempio più semplice che riesco di seguito. Qualsiasi aiuto è possibile fornire sarebbe apprezzato:
All'interno del file h mia UIView di sottoclasse:
#import <UIKit/UIKit.h>
@protocol TestDelegate <NSObject>
@optional
-(double)GetLineWidth;
@end
@interface ViewSubclass : UIView {
id<TestDelegate> delegate;
}
@property (nonatomic, retain) id<TestDelegate> delegate;
@end
All'interno file h della mia classe delegato:
#import <Foundation/Foundation.h>
#import "ViewSubclass.h"
@interface ViewDelegate : NSObject <TestDelegate> {
}
@end
All'interno .m della mia classe delegato File:
#import "ViewDelegate.h"
@implementation ViewDelegate
-(double)GetLineWidth {
return 25.0;
}
@end
All'interno del file .m mia UIView di sottoclasse:
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
double lineWidth = 2.0;
if (delegate == nil) {
ViewDelegate *vd = [[ViewDelegate alloc]init];
delegate = vd;
}
// If I comment out the "if" statement and just call the delegate
// delegate directly, the call works!
if ([delegate respondsToSelector:@selector(GetLineWidth:)]) {
lineWidth = [delegate GetLineWidth];
}
CGContextSetLineWidth(context, lineWidth);
In genere non si vuole mantenere delegati '@property (nonatomic, assegnare) id delegato;' –
slf
Cosa disse Rob ; quel metodo dovrebbe essere chiamato 'lineWidth'. I metodi non dovrebbero mai iniziare con lettere maiuscole e dovrebbero iniziare solo con 'get' in circostanze molto rare. Questa non è una scelta di stile, questo è un modello che devi seguire affinché tutte le funzionalità del framework funzionino correttamente. – bbum