2012-04-25 4 views
0

Я очень новичок в Objective-C. Я пытаюсь написать метод, в котором я создаю UIImageView, который содержит файл изображения определенного размера.Передача значений параметрам метода для создания CGRect

Вот мой метод:

- (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 *' (так называемый 'поплавок *') против 'NSInteger' (он же 'INT')

Я хотел бы назвать это так:

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

Xcode бросает это предупреждение для вызова: Несовместимое целое число с преобразованием указателя, переводящее 'int' в параметр типа 'CGFloat *' (aka 'float *');

Я попытался изменить параметры на float, CGFloat и int, но я получаю такую ​​же ошибку.

Любая помощь будет оценена по достоинству.

Благодаря Мори

ответ

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)]; 

Использование именованных параметров, как правило, думают как хороший стиль тоже.

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}];