У меня есть небольшая загадка, которая сводит меня прямо вверх по стене. Я использую делегацию довольно сильно, как шаблон в приложении, который я пишу. Я пытаюсь быть как «осторожным» в коде, вызывающем делегатом, так как смогу, чтобы проверить делегат с помощью «[делегата RESPSTSELECTOR] на каждом делегированном вызове. Все работает нормально, если я не нахожусь в подклассе UIView. В этом случае RepentStoselector возвращает НЕТ, но я могу безопасно позвонить в код делегата так ясно, что он существует и работает правильно.
Я варил его до самого простого примера, который я могу ниже. Любая помощь, которую вы можете предоставить, будет оценена:
Внутри моего файла подкласса UIVIEW Subclass .h:
#import <UIKit/UIKit.h>
@protocol TestDelegate <NSObject>
@optional
-(double)GetLineWidth;
@end
@interface ViewSubclass : UIView {
id<TestDelegate> delegate;
}
@property (nonatomic, retain) id<TestDelegate> delegate;
@end
Внутри моего файла класса делегатов:
#import <Foundation/Foundation.h>
#import "ViewSubclass.h"
@interface ViewDelegate : NSObject <TestDelegate> {
}
@end
Внутри моего файла класса делегата:
#import "ViewDelegate.h"
@implementation ViewDelegate
-(double)GetLineWidth {
return 25.0;
}
@end
Внутри моего подкласса UIVIEW .m Файл:
- (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);