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

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? Что еще может быть причиной, если не цвет переключателя?

4b9b3361

Ответ 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