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
Я также использую ARC. В iOS 6 мое приложение продолжает сбой. Я включил NSZombie, и он продолжает говорить: *** -[UIDeviceRGBColor release]: message sent to deallocated instance 0x9658eb0
И теперь я понял один совершенно воспроизводимый поток для вышеупомянутого. Когда я комментирую только строку setThumbTintColor внутри customizeAppearance, тогда все работает нормально, как должно. Когда я использую только строку setThumbTintColor, приложение каждый раз вылетает точно так же.
Это известная проблема для любого пользователя с UISwitch/setThumbTintColor/UIColor? Что еще может быть причиной, если не цвет переключателя?
Ответы
Ответ 1
Я также делал этот учебник и имел ту же проблему. (Не знаете, почему вы этого не испытываете, так как моя рука набрала код и код решения для меня такая же проблема?)
Первый сеанс произойдёт нормально, но после возврата следующего сеанса произойдет сбой.
После установки глобальной контрольной точки исключения я мог увидеть thumbColorTint в стеке вызовов, когда было создано исключение. Я предположил, что объект был выпущен слишком рано. Чтобы исправить, я создал свойство в своем делетете приложения... (вам не нужно делать это в делетете приложения только объект, который вы устанавливаете внешний вид UISwitch, который в моем случае был appdelegate)
@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: (
Ответ 2
Я также столкнулся с этой ошибкой с чрезмерной выпуском 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]];
С другой стороны, он создает предупреждение о компиляторе, но тогда - там действительно есть ошибка, а не наша!
Ответ 3
В настоящее время я собираюсь с этим ответом на каждый ответ:
// 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