UISwitch setThumbTintColor вызывает сбой (только для iOS 6)?

ОБНОВЛЕНИЕ. Получил письмо от Apple, в котором говорилось, что ошибка/проблема уже исправлена, и в следующем выпуске SDK этой проблемы не будет. Мир!

У меня есть это в коде моего AppDelegate:

- (void) customizeAppearance {
    [[UISwitch appearance] setOnTintColor:[UIColor colorWithRed:0 green:175.0/255.0 blue:176.0/255.0 alpha:1.0]];
    [[UISwitch appearance] setTintColor:[UIColor colorWithRed:255.0f/255.0f green:255.0f/255.0f blue:255.0f/255.0f alpha:1.000f]];
    [[UISwitch appearance] setThumbTintColor:[UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1.0]];
 }

Который я затем звоню из - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Я тоже пользуюсь АРК. В iOS 6 мое приложение продолжает падать. Я включил NSZombie, и он продолжает говорить: *** -[UIDeviceRGBColor release]: message sent to deallocated instance 0x9658eb0

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

Это известная проблема для тех, у кого есть UISwitch/setThumbTintColor/UIColor? В чем еще может быть причина, если не в цвете переключателя?


person Bourne    schedule 19.10.2012    source источник
comment
Я не знаю, почему это происходит, но если вы можете воспроизвести это в простом примере приложения, вы можете опубликовать сообщение об ошибке по адресу bugreport.apple.com   -  person Michael Ochs    schedule 19.10.2012
comment
См. raywenderlich.com/21703/user-interface-customization-in. -ios-6 . Не падает в своем примере приложения. Я думаю, это что-то другое. Что я испортил в своем приложении, я понятия не имею.   -  person Bourne    schedule 19.10.2012
comment
Когда он падает? О вызове этой строки из вашего поста? Если вы вызовете это в -application:didFinishLaunchingWithOptions:, его будет легко найти, так как на данный момент не так много выполнено. Если произойдет сбой где-то еще, может быть интересно увидеть часть окружающего кода.   -  person Michael Ochs    schedule 19.10.2012
comment
Код, размещенный здесь, работает нормально. Проблема должна быть где-то в другом. Вы пытались установить точку останова для исключения?   -  person Andreas Ley    schedule 19.10.2012
comment
Это все еще существует. Активности на зарегистрированном радаре пока нет.   -  person Bourne    schedule 31.01.2013
comment
Есть новости по радару? Я могу воспроизвести его последовательно.   -  person    schedule 18.06.2013
comment
Скорее всего, код Apple включает в себя слабую ссылку, которая должна быть сильной, потому что нет ошибки, когда для thumbTintColor установлено значение [UIColor redColor];   -  person    schedule 18.06.2013
comment
Вот радар, который я запилил давным-давно. Обманите его, если вы также столкнулись с этой проблемой. рдар://12562867   -  person Bourne    schedule 20.06.2013
comment
Ошибка исправлена ​​в следующем выпуске по заявлению Apple.   -  person Bourne    schedule 03.07.2013
comment
Большое Вам спасибо. Это связало меня с ошибкой UISwitch, иначе мне пришлось бы искать целую вечность.   -  person palme    schedule 20.11.2013


Ответы (3)


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

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

После установки глобальной точки останова исключения я мог видеть thumbColorTint в стеке вызовов, когда было сгенерировано исключение. Я предположил, что объект был выпущен слишком рано. Чтобы исправить это, я создал свойство в моем делегате приложения.

@interface SurfsUpAppDelegate()
@property (strong, nonatomic) UIColor *thumbTintColor;
@end

Затем я установил его так

[self setThumbTintColor:[UIColor colorWithRed:0.211 green:0.550 blue:1.000 alpha:1.000]];
[[UISwitch appearance] setThumbTintColor:[self thumbTintColor]];

И теперь все работает как положено, так как объект не освобождается досрочно. Вероятно, это дефект, и объект освобождается, хотя он все еще нужен. UISwitch, похоже, имеет дефект API :(

person maninvan    schedule 22.10.2012
comment
Это решает проблему. Значит принято. Я также нашел еще один обходной путь. Установка сильного родительского представления коммутатора также предотвращает сбой. Я пошел дальше и все равно зарегистрировал ошибку в примере проекта, так как это никогда не происходит для любого другого элемента пользовательского интерфейса, кроме переключателя, и это тоже только при установке свойства thumbTintColor. - person Bourne; 28.10.2012
comment
У меня такая же проблема. Оба решения Билла и Борна работают для меня. Однако у меня есть другой проект, содержащий навигационный контроллер. 5 контроллеров представления находятся в стеке, и иногда представление может быть отправлено/вытолкнуто. Когда любая сцена содержит переключатель. Ни одно из вышеперечисленных решений не работает. Я думаю, мы просто подождем, пока Apple это исправит. - person Wayne Liu; 27.03.2013
comment
Этот обходной путь, похоже, не имеет никакого эффекта для меня. Мое приложение аварийно завершает работу, когда экземпляры коммутатора освобождаются, независимо от того, как я устанавливаю thumbTintColor. - person metatation; 18.04.2013
comment
Жаль, что это работает не во всех случаях. Я подозреваю, что в одних случаях он запускался правильно, а в других нет (как указывает Уэйн). Исправление ошибки решит эту проблему раз и навсегда. NONT делает хорошее предложение, но это может не сработать, когда оно будет исправлено. Подобные проблемы с памятью трудно исправить ретро. - person maninvan; 30.05.2013

Я также столкнулся с этой ошибкой с чрезмерным выпуском Apple UISwitch. У меня есть похожее решение, но я думаю, что оно немного лучше, потому что не требует добавления постороннего свойства:

UIColor *thumbTintColor =  [[UIColor alloc] initWithRed:red green:green blue:blue alpha:alpha]];

//we're calling retain even though we're in ARC,
// but the compiler doesn't know that

[thumbTintColor performSelector:NSSelectorFromString(@"retain")]; //generates warning, but OK
[[UISwitch appearance] setThumbTintColor:[self thumbTintColor]];

С другой стороны, это создает предупреждение компилятора, но тогда — здесь действительно есть ошибка, только не наша!

person nont    schedule 19.04.2013

На данный момент я исхожу из ответа Билла:

// SomeClass.m

@interface SomeClass ()

// ...

@property (weak,   nonatomic) IBOutlet UISwitch *thumbControl;
@property (strong, nonatomic)           UIColor *thumbControlThumbTintColor;

// ...

@end

@implementation SomeClass

// ...

- (void)viewDidLoad
{
    // ...

    self.thumbControl.thumbTintColor = self.thumbControlThumbTintColor = [UIColor colorWithRed:0.2 green:0.0 blue:0.0 alpha:1.0];

    // ...
}

// ...

@end
person Community    schedule 18.06.2013