错误:初始化中的类型不兼容? (iPhone,目标C)

时间:2009-12-21 05:18:24

标签: iphone objective-c types

我收到错误“float pos = [sender value];”... sender应该是我在Interface Builder中设置的UISlider。

ButtonViewController.m

- (IBAction)slide: (id)sender {
 float pos = [sender value];
 loadValue.progress = pos;
}

ButtonViewController.h

@interface Button_Fun4ViewController : UIViewController {
 IBOutlet UIProgressView *loadValue;
}

- (IBAction)slide: (id)sender;

感谢。

3 个答案:

答案 0 :(得分:3)

虽然发送者“应该”是一个UISlider,但编译器并不知道。它看到的只是id,它绑定到它可以找到的第一个匹配方法签名;可能是一个返回浮点数以外的东西(作为最后的猜测,编译器会假设它返回id)。

在这种情况下,您需要将此类型转换为UISlider:

- (IBAction)slide: (id)sender {
    float pos = [(UISlider *)sender value];
    loadValue.progress = pos;
}

使用NSAssert()if()仔细检查这是事实UISlider不是一个坏主意,但并非绝对必要。

答案 1 :(得分:1)

由于sender的类型为'id',编译器不知道它将从消息中返回什么,并假设它们将返回'id'类型的值。您需要将发送者强制转换为UISlider(因此编译器知道-value返回一个float),或者将消息的返回值强制转换为float。

答案 2 :(得分:1)

由于sender的类型为id,因此您应指明它的类型。

使用以下内容:

float pos = [(UISlider *)sender value];

或者,您可以使用协议。这样,您可以接收不同类型的对象,只要它们符合协议,就可以以相同的方式使用。

@protocol myProtocol {
-(float)value;
}

-(void)myMethod:(id<myProtocol>)sender {
    float pos = [sender value];
}