自定义委托没有响应iOS
我已经设置了一个代表,让他接受仪表的新旧位置。然而,我似乎无法从代表那里得到回应。我可能会错过一些东西,但我做了一系列的研究,似乎一切都井然有序 梅特维尤自定义委托没有响应iOS,ios,iphone,objective-c,delegates,Ios,Iphone,Objective C,Delegates,我已经设置了一个代表,让他接受仪表的新旧位置。然而,我似乎无法从代表那里得到回应。我可能会错过一些东西,但我做了一系列的研究,似乎一切都井然有序 梅特维尤 #import <UIKit/UIKit.h> #import "KTOneFingerRotationGestureRecognizer.h" @protocol MeterViewDelegate; @interface MeterView : UIView{ IBOutlet UIImageView *gau
#import <UIKit/UIKit.h>
#import "KTOneFingerRotationGestureRecognizer.h"
@protocol MeterViewDelegate;
@interface MeterView : UIView{
IBOutlet UIImageView *gauge;
IBOutlet UIImageView *needle;
float rotation, oldPos, newPos;
KTOneFingerRotationGestureRecognizer *rgest;
}
@property (nonatomic, weak) id<MeterViewDelegate> delegate;
- (IBAction)handleMovedNeedle;
@end
@protocol MeterViewDelegate <NSObject>
- (void)meterView:(MeterView*)view OldValue:(float)oldval NewValue:(float)newval;
@end
#导入
#导入“KToneFingerRotationGestureRecognitor.h”
@协议MeterViewDelegate;
@接口MeterView:UIView{
IBUIImageView*仪表;
IBUIImageView*针;
浮动旋转,oldPos,newPos;
KToneFingerRotationGestureRecogener*rgest;
}
@属性(非原子,弱)id委托;
-(IBAction)手柄移动针;
@结束
@协议MeterViewDelegate
-(void)meterView:(meterView*)视图OldValue:(float)oldval NewValue:(float)newval;
@结束
梅特维尤
#import "MeterView.h"
#import <QuartzCore/QuartzCore.h>
@implementation MeterView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
-(void)handleMovedNeedle{
if ([self.delegate respondsToSelector:@selector(meterView:OldValue:NewValue:)]) {
[self.delegate meterView:self OldValue:oldPos NewValue:newPos];
}
else{
NSLog(@"Delegate call FAIL, needle moved from %f, to %f", oldPos,newPos);
}
}
-(void)awakeFromNib{
gauge = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"gauge.png"]];
needle = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"needle.png"]];
needle.frame = CGRectMake(0,gauge.frame.size.height-(needle.frame.size.height/2), gauge.frame.size.width, needle.frame.size.height);
[self addSubview:gauge];
[self addSubview:needle];
rotation = 0;
rgest = [[KTOneFingerRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
rgest.center = CGPointMake(CGRectGetMidX([needle bounds]) + needle.frame.origin.x, CGRectGetMidY([needle bounds]) + needle.frame.origin.y);
[self addGestureRecognizer:rgest];
}
- (void)rotate:(UIRotationGestureRecognizer *)recognizer {
switch (recognizer.state) {
case UIGestureRecognizerStateBegan: {
oldPos = ([(NSNumber *)[needle.layer valueForKeyPath:@"transform.rotation.z"] floatValue]/3.14)*100;
}
break;
case UIGestureRecognizerStateChanged: {
CGFloat angle = [(NSNumber *)[needle.layer valueForKeyPath:@"transform.rotation.z"] floatValue];
angle += [recognizer rotation];
if (angle >= 0 && angle <= M_PI) {
[needle setTransform:CGAffineTransformRotate([needle transform], [recognizer rotation])];
rotation += [recognizer rotation];
}
}
break;
case UIGestureRecognizerStateEnded: {
newPos = ([(NSNumber *)[needle.layer valueForKeyPath:@"transform.rotation.z"] floatValue]/3.14)*100;
[self handleMovedNeedle];
}
break;
default:
break;
}
}
@end
#导入“MeterView.h”
#进口
@实现MeterView
-(id)initWithFrame:(CGRect)帧
{
self=[super initWithFrame:frame];
如果(自我){
}
回归自我;
}
-(无效)手柄移动针{
if([self.delegate respondsToSelector:@selector(meterView:OldValue:NewValue:)])){
[self.delegate meterView:self-OldValue:oldPos-NewValue:newPos];
}
否则{
NSLog(@“代理调用失败,指针从%f移动到%f”,旧POS,新POS);
}
}
-(无效)从NIB中唤醒{
gauge=[[UIImageView alloc]initWithImage:[UIImageName:@“gauge.png”];
Pinele=[[UIImageView alloc]initWithImage:[UIImageName:@“needle.png”];
Pinele.frame=CGRectMake(0,规格.框架.尺寸.高度-(Pinele.frame.尺寸.高度/2),规格.框架.尺寸.宽度,Pinele.frame.尺寸.高度);
[自添加子视图:仪表];
[自添加子视图:针];
旋转=0;
rgest=[[ktoneFingerRotationGestureRecognitizer alloc]initWithTarget:自操作:@selector(rotate:)];
rgest.center=CGPointMake(CGRectGetMidX([针边界])+针框架.origin.x,CGRectGetMidY([针边界])+针框架.origin.y);
[自选地址识别器:rgest];
}
-(无效)旋转:(ui旋转手势识别器*)识别器{
开关(识别器状态){
案例UIgestureRecognitzerStateStart:{
oldPos=([(NSNumber*)[pinder.layer值forkeypath:@“transform.rotation.z”]floatValue]/3.14)*100;
}
打破
案例UIgestureRecognitzerStateChanged:{
CGFloat angle=[(NSNumber*)[POINTER.layer VALUES FOKYPATH:@“transform.rotation.z”]floatValue];
角度+=[识别器旋转];
如果(角度>=0&&angle此代码:
secondMeter = [[MeterView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
secondMeter.delegate = self;
thirdMeter = [[MeterView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
thirdMeter.delegate =self;
创建视图的两个实例,但不会将它们添加到视图中,因此永远不会看到它们
因此,您可能有一些其他视图实例在视图中,但没有代理,这些视图有代理,但没有显示。可能是因为您有插座,所以来自XIB/故事板
使用插座将显示的视图连接到代理,而不是创建新实例
如果将视图中的委托属性设置为IBOutlet
本身,则可以将视图控制器连接为XIB/情节提要中的委托,而不必担心代码中的委托…一切似乎都很好。请登录手势识别器方法,查看它们是否真的被调用。查看您尝试在MeterView.m
类中使用自动合成属性\u delegate
而不是self.delegate
#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
#define DEG2RAD(degrees) (degrees * 0.01745327) // degrees * pi over 180
#define RAD2DEG(radians) (radians * 57.2957795) // radians * 180 over pi
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
secondMeter = [[MeterView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
secondMeter.delegate = self;
thirdMeter = [[MeterView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
thirdMeter.delegate =self;
}
-(void)meterView:(MeterView *)view OldValue:(float)oldval NewValue:(float)newval{
NSLog(@"Delegate call SUCCESS, need moved from %f, to %f", oldval,newval);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
secondMeter = [[MeterView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
secondMeter.delegate = self;
thirdMeter = [[MeterView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
thirdMeter.delegate =self;