Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义委托没有响应iOS_Ios_Iphone_Objective C_Delegates - Fatal编程技术网

自定义委托没有响应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;