我对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,但是我得到了相同的错误变体。
任何帮助都将不胜感激。
由于 莫里
答案 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}];