Способ установки изображения кнопки

Я хочу, чтобы этот метод проверял, истинно ли условие, затем установите определенную кнопку (кнопку), чтобы иметь изображения, которые я указываю. Вот код.

-(void)canAfford:(float) f: (UIButton*)button {
    if([self playerHas:(f)] == YES) {
        [button setImage:[UIImage imageNamed:nil] forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:@"ButtonBGclicked.png"] forState:UIControlStateHighlighted];
    } else {
        [button setImage:[UIImage imageNamed:@"ButtonBG.png"] forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:nil] forState:UIControlStateHighlighted];
    }
}

вот ошибка, которую я получаю.

2013-09-22 10:35:39.985 Tapple[15663:a0b] CUICatalog: Invalid asset name supplied: , or invalid scale factor: 1.000000

6 ответов


вы призываете [UIImage imageNamed:@""] или [UIImage imageNamed:nil]. Ни одно изображение не будет соответствовать пустой строке. Если вы пытаетесь очистить изображение, pass nil вместо imageNamed:.

попробуйте это (обновленный исходный код, включающий комментарий @Kyle Fang):

- (void)canAfford:(float) f: (UIButton*)button {
    if([self playerHas:(f)] == YES) {
        [button setImage:nil forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:@"ButtonBGclicked.png"] forState:UIControlStateHighlighted];
    } else {
        [button setImage:[UIImage imageNamed:@"ButtonBG.png"] forState:UIControlStateNormal];
        [button setImage:nil forState:UIControlStateHighlighted];
    } }

лучший способ использовать точки останова для поиска конкретного вызова, вызывающего +[UIImage imagenamed:] для генерации ошибки, - использовать символическую точку останова.

откройте навигатор точек останова и нажмите кнопку "+" в левом нижнем углу. Выберите " Добавить Символическую Точку Останова...". Затем измените точку останова, чтобы иметь следующие настройки:

символ: +[UIImage imageNamed:] Условие: $ r2 == nil

тесты условий регистрируют r2, который указывает на аргумент imageNamed: method, для аргумента с нулевым значением метода. Вы также можете установить условие (BOOL) [(NSString*)$r2 isEqualToString:@""], если вы хотите увидеть, используется ли пустая строка в качестве аргумента. Обратите внимание, что регистр r2 присутствует только в случае отладки на устройстве. Симулятор будет использовать регистр с другим именем, поскольку он работает на архитектуре x86.

когда условия будут выполнены, отладчик сломает в коде ассемблера Библиотека UIKit, но вы можете найти исходный источник вызова в трассировке стека потока.

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


после использования каталога активов , нового в Xcode 5, у меня возникла та же ошибка "CUICatalog: недопустимое имя актива: или недопустимый масштабный коэффициент: 2.000000".

после некоторой отладки я обнаружил, что причиной этой ошибки была передача аргумента "nil" или пустой строки @"" методу класса [UIImage imageNamed:]. Даже передача имени файла, которого не было в пакете, не вызвала эту ошибку.

поэтому я согласен с bneely (следовательно, встал голосовать) за исправление. Теперь, если вы сделали то, что предложил бнили, и все еще получаете ошибку, убедитесь, что вы проходите через свой код и, возможно, размещаете точку останова везде, где вы вызываете [UIImage imageNamed:] и видите, передаете ли вы ноль или пустую строку в качестве аргумента.

FYI, чтобы создать точку останова, просто нажмите на левом краю редактора кода и добавьте синюю точку останова. Затем щелкните правой кнопкой мыши на точке останова и выберите "Изменить точку останова..- из всплывающего меню. Затем в Поле "условие" введите что-то вроде этого :

(!imageFileName || [imageFileName isEqualToString:@""])

где imageFileName-строка, представляющая файл изображения, который вы пытаетесь загрузить.


я обнаружил, что источником этой проблемы для меня было то, что массив, который я получал данные из define the image, был отмечен weak, nonatomic и очищение от меня.

установка массива источника данных как nonatomic, retain исправлен этот вопрос.


1) Добавить символическую точку останова после нажатия кнопки "плюс". plus sign at the bottom 2) Добавьте эту логическую строку, чтобы проверить пустую строку boolean line for condition 3) это было добавлено автоматически (не уверен после сборки или нет), поэтому я отредактировал, чтобы добавить условие check for nil

надеюсь, это может помочь немного больше, включая меня.


читать это, только если вы используете IB и раскадровки!

У меня была эта проблема после того, как я установил изображение для UIImageView в раскадровке, а затем изменил это имя изображения в каталоге активов. ImageView в раскадровке все еще был с этим изображением, хотя в инспекторе атрибутов для просмотра изображений поле изображения говорило "неизвестное изображение". Все работало нормально, потому что позже я настраивал Изображение через код, за исключением раздражающего журнала.

тьфу, похоже, чрезмерное использование слова "изображение", надеюсь, это поможет кто-то.