将值传递给方法参数以创建CGRect

时间:2012-04-25 02:25:55

标签: objective-c ios ipad

我对Objective-C很新。我正在尝试编写一个方法,我创建一个包含特定大小的图像文件的UIImageView。

这是我的方法:

- (void)setImageViewElements:(UIImageView *)imageViewName : (NSString *)imageName : (NSInteger )topX : (NSInteger )topY : (NSInteger )imageWidth : (NSInteger )imageHeight
{
    imageViewName = [[UIImageView alloc] initWithFrame:CGRectMake(topX, topY, imageWidth, imageHeight)];
    [imageViewName setImage:[UIImage imageNamed:imageName]];
    [self.view addSubview:imageView];
}

Xcode会针对该方法抛出此警告: 'setImageViewElements ::::::'的实现中存在冲突的参数类型:'CGFloat *'(又名'float *')vs'NSInteger'(又名'int')

我想这样称呼:

[self setImageViewElements:myImageView :@"myImage.png" :150 :532 :112 :82];

Xcode会为此调用抛出此警告: 不兼容的整数到指针转换将'int'发送到'CGFloat *'类型的参数(又名'float *');

我已经尝试将参数更改为float,CGFloat和int,但是我得到了相同的错误变体。

任何帮助都将不胜感激。

由于 莫里

2 个答案:

答案 0 :(得分:2)

“实现中的冲突参数类型...”表明.h文件中的方法签名与.m文件中的方法签名不匹配。也许您的.h仍有使用CGFloat的旧版本?

作为一个侧面建议,为什么不传入“更大”的对象和结构而不是单独的图像名称,x,y,width和height参数?类似的东西:

- (void) setImageViewElements:(UIImageView *)imageViewName
                    withImage:(UIImage *)image
                      inFrame:(CGRect)rect

然后你会这样称呼它:

[self setImageViewElements:myImageView
                 withImage:[UIImage imageNamed:@"myImage.png"]
                   inFrame:CGRectMake(150, 532, 112, 82)];

通常认为使用命名参数也是一种好的风格。

答案 1 :(得分:0)

您的头文件包含此方法的声明,该声明至少有一个CGFloat *,您在定义中NSInteger

编译器在关于该冲突的第一次警告中抱怨。第二个警告是因为编译器使用头中的版本来生成代码,并且它认为您希望它使用整数作为指向CGFloat的指针,这不是一个好主意。

这里有两个问题。首先,CGFloat的参数不需要是指针。那些是原始类型,而不是对象。第二,声明和定义之间的冲突。第三,你的方法名称缺少参数的标签,这是合法的,但完全违背既定的风格,而且很难阅读。三个问题。

声明:

- (void)prepareImageView:(UIImageView *)imageView withImageName:(NSString *)name originX:(CGFloat)topX originY:(CGFloat)topY width:(CGFloat)width height:(CGFloat)height;

确保定义看起来相同,尤其是包括参数的类型。

您还可以通过使方法采用CGRect参数来简化阅读:

- (void)prepareImageView:(UIImageView *)imageView withImageName:(NSString *)name frame:(CGRect)frame;

然后你会这样打电话:

[self prepareImageView:myImageView withImageName:@"myImage.png" frame:(CGRect){150, 532, 112, 82}];