Добавление изображения в NSObject - возможно?

Позже у меня будут объекты, считываемые из файла .csv (файл с разделителями-запятыми), который содержит имена файлов. Вот почему я пытаюсь сделать это вот так.

Я хотел бы сделать так, чтобы кнопка получала изображение из имени файла в csv.

Что я пробовал до сих пор: Объект:

@interface question : NSObject
{
@private
UIImage *imageName;
}
@property (nonatomic, retain)UIImage *imageName;

(Я пробовал использовать NSString, а также UIImage, ни один из них не работает так, как я хочу)

ViewController:

- (void)viewDidLoad
{
[super viewDidLoad];
question *question1 = [[question alloc]init];
[question1.imageName initWithContentsOfFile:@"Default.png"];//Will be read from a csv later on, just typing it in manually for a test
testImage = question1.imageName;

}


-(void)imageshow
{
//(UIImage *)testImage;(NSString *)imageNameString; Didnt work
//[self.testImage initWithContentsOfFile:@"%@",questiont.imageName]; - Doesnt work either

[testButton setImage:testImage forState:UIControlStateNormal];


}
-(IBAction)test:(id)sender
{
[self imageshow];
}

Когда этот код не работает, когда я нажимаю кнопку тестирования, ничего не происходит (не происходит сбой)

Как мне это сделать правильно? (Добавьте изображение с текстовым именем файла в NSObject, а затем покажите его в виде кнопки / изображения)


person Oscar Apeland    schedule 27.02.2013    source источник
comment
где ваш магазин @ Default.png?   -  person Guo Luchuan    schedule 27.02.2013
comment
@GuoLuchuan В папке вспомогательных файлов это просто черное фоновое изображение по умолчанию.   -  person Oscar Apeland    schedule 27.02.2013
comment
попробуйте следующее: question1.img = [UIImage imageNamed: @ Default.png]; [testButton setImage: question1.img forState: UIControlStateNormal];   -  person yunas    schedule 27.02.2013
comment
@yunas Сработало, отлично, спасибо! Могу ли я использовать переменную (%@) в imageNamed: @, чтобы использовать разные имена? и вы хотите представить это как ответ, чтобы получить немного кармы от accept?   -  person Oscar Apeland    schedule 27.02.2013
comment
@OscarApeland, только что обновлено как ответ :)   -  person yunas    schedule 27.02.2013


Ответы (3)


   question1.img = [UIImage imageNamed:@"Default.png"]; 
    [testButton setImage:question1.img forState:UIControlStateNormal];

и да, вы можете попробовать следующее для динамических изображений

   question1.img = [UIImage imageNamed:[NSString stringWithFormat:"%@",imgName]];

imgName => - это имя изображения, а не пример изображения: «abc.png» или «123.png» и т. д.

person yunas    schedule 27.02.2013
comment
Потрясающе, именно то, что я хотел. Большое спасибо. - person Oscar Apeland; 27.02.2013

если ваше свойство называется imageName, переменная-аксессор автоматически получает имя _imageName.

В вашем коде используются две разные переменные.

@interface question : NSObject
{
   @private
   UIImage *_imageName;
}
@property (nonatomic, retain)UIImage *imageName;

imageName - не лучшее имя для свойства, содержащего изображение ... оно лучше подходит для строки.

person Bastian    schedule 27.02.2013
comment
Да, изначально он предназначался для струны, но я просто играл и не удосужился придумать для всего причудливые названия. - person Oscar Apeland; 27.02.2013

Есть кое-что, что нужно изменить.

По обычным причинам пишите все имена классов с верхнего регистра в начале. Это упрощает чтение, обмен на форумах как SO и позволяет избежать ошибок. Переменные второго имени, желательно говорящие или абстрактные. Но чтобы не выбрать вводящее в заблуждение имя, такое imageName. В этой переменной должно быть имя, а не изображение или, может быть, рисунок, который отображает имя. :)

imageWithContentsOfFile ожидает полного имени файла. Если "Default.png "является частью вашей границы, как я понимаю по названию, то imageNamed:@"Default.png" подойдет.

Ваш setImage выглядит почти хорошо. Конечно, он не может работать, пока ваше изображение (null). Однако прямой доступ к iVar на данный момент не является хорошей деловой практикой. Вы должны использовать его сеттер / получатель. Вместо этого используйте:

[self.testButton setImage:self.testImage forState:UIControlStateNormal];

В вашем случае это не имеет большого значения. Но, как и другие соглашения, это помогает избежать ошибок, когда вы смешиваете свой код с кодом, который вы нашли в Интернете, или когда вы работаете в команде.

person Hermann Klecker    schedule 27.02.2013