Подтвердить что ты не робот

UIButton setImage не работает

Я теряю рассудок над этим. У меня UIButton подключен как Outlet. Я хочу изменить его образ. В функции viewDidLoad я пытаюсь установить изображение следующим образом:

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

Ничего не происходит. Однако, если я использую ImagePicker, это как-то работает. В функции ImagePickers "didFinishPickingImage" я повторяю точно такую ​​же команду, как указано выше, для установки изображения, и она работает, изображение отображается нормально.

Я думал, что, возможно, изображение кнопки не освежает себя, но пытается вызвать [button1 setNeedsDisplay] или [button1.imageView setNeedsDisplay] или даже [button1.imageView.image setNeedsDisplay] ничего не делает.

Есть ли у кого-нибудь идеи об этом? Я потратил два часа на это, и я действительно расстраиваюсь, потому что я уверен, что причина должна быть настолько глупой, что это невероятно.

4b9b3361

Ответ 1

Для тех, кто окажется в подобной ситуации; Я использовал указанную кнопку внутри пользовательской ячейки для представления таблицы. Однако ячейки сразу не загружаются (т.е. Внутри viewDidLoad/viewWillAppear и т.д.), Но внутри функции tableView: cellForRowAtIndexPath. В этот момент все мои переменные кнопок были нулевыми. Мое решение состояло в том, чтобы загрузить изображение после того, как ячейка была создана, и сработала сразу после этого.

Ответ 2

Пожалуйста, проверьте тип кнопки.

Если ваш тип кнопки - "Система", вы должны изменить его на "Пользовательский"

Ответ 3

Две вещи здесь:

# 1, измените свой код на:

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

и # 2

убедитесь, что ваш UIImage возвращает допустимое изображение.

Другими словами,

UIImage * imageToSet = [UIImage imageNamed: @"house.png"];
if(imageToSet)
{
    [button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
} else {
    // if you see this line in your console, then you know where to look for a problem
    NSLog( @"why is my image object nil?");
}

Ответ 4

Вот пара дополнительных заметок. UIButton setImage: forState: правильный метод:

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

imageNamed - отличный способ для захвата изображения, но убедитесь, что он возвращает объект. Забыть включить файл изображения в текущую цель получает меня все время.

[UIImage imageNamed:@"house.png"] 

Вам также не требуется расширение. SDK справляется с этим.

[UIImage imageNamed:@"house"] 

И хотя UIControlState - это бит-маска, вы не можете объединить значения. Это не работает, и я должен должен помнить об этом, потому что он получает меня каждый раз, когда я пользуюсь вызовом.

// NO NO NO
[button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateNormal|UIControlStateSelected]; 

// YES
[button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateNormal];
[button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateSelected]; 

Ответ 5

Получалась та же проблема, когда UIbutton находился в UITableViewCell.

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"detail.png"] forState:UIControlStateNormal];

должен работать в UITableViewCell

Ответ 6

Последнее, что вы хотите проверить - убедитесь, что вы устанавливаете изображение в основной теме! Просто наткнулся на проблему, когда я устанавливал изображение кнопки в обратном вызове из ALAssetLibrary (выборка изображений из библиотеки фотографий). Изображение не будет обновляться, пока я не постучу кнопкой. Оказывается, обратный вызов происходил из основного...

Ответ 7

Рад, что проблема решена, но ни один из ответов на самом деле не решает проблему.

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

1) IBOutlet не подключен или не переименован.

2) Убедитесь, что тип кнопки UIB custom.

3) Изображение установлено (более одного раза) где-то еще в коде.

4) Вы пытаетесь установить изображение через любой sync method, который не использует основной поток. (На этом есть несколько тем).

5) Если вы вкладываете изображения как подпредставления, убедитесь, что проблема не в родительском представлении.

6) Если он появляется в симуляторе, но не в устройстве, то это буква (прописная, строчная разница в коде и имени файла.

7) Современные симуляторы работают с очень низкой памятью GPU на старых машинах. Вы можете настроить параметры симулятора, чтобы он появился. E.g(Ctrl + стрелка вправо) дважды, чтобы изменить ориентацию симулятора, и ваши изменения появятся.

Есть несколько других, но распространенных ошибок, которые разработчики обычно упускают из виду

1) Изображение не существует ИЛИ вы делаете орфографическую ошибку.

2) Тип файла отличается от упомянутого. (JPG, PNG).

Ответ 8

Для меня это было перемещение строки:

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

из awakeFromNib метод

to viewDidLoad метод

Ответ 9

Я думаю, не создавайте, как это  UIButton * nextButton = [кнопка UIButtonWithType: UIButtonTypeRoundedRect];  с помощью этого метода создания UIButton создается с использованием типа по умолчанию, поэтому фоновое изображение не работает. попробуй это,  UIButton * nextButton = [[UIButton alloc] initWithFrame: CGRectMake (9, 154, 300, 48)];  или другой, кроме buttonWithType

Ответ 10

Это происходит из-за того, что состояние кнопки не выбирается после щелчка по умолчанию. Я решил это, сделав IBaction на этой кнопке и переключив выбранное состояние. -(IBAction) checkButtonClicked:(id)sender{ checkButton.selected = !checkButton.selected; }

Ответ 11

В моем случае он нарисован пользовательским кодом анимации, а не установленным изображением, поэтому он не работает, устанавливая какое-либо изображение, он должен изменить код анимации.

Ответ 12

Используйте setBackgroundImage: forState: