18

更新:バグ/問題は現在修正されており、次のSDKリリースではこの問題は発生しないというAppleからのメールを受け取りました。平和!

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

そして今、私は上記の1つの完全に再現可能なフローを実現しました。CustomizeAppearance内でsetThumbTintColor行だけをコメントアウトすると、すべてが正常に機能します。代わりにsetThumbTintColor行を使用すると、アプリは毎回まったく同じ方法でクラッシュします。

これは、UISwitch / setThumbTintColor / UIColorを使用している人には既知の問題ですか?スイッチの色でない場合、他に何が原因である可能性がありますか?

4

3 に答える 3

19

私もこのチュートリアルをやっていて、同じ問題を抱えていました。(コードを入力した私の手とソリューションコードの両方が私にとって同じ問題を抱えているので、なぜこれを経験しないのかわかりませんか?)

最初のセグエは問題なく発生しますが、戻った後、次のセグエは失敗します。

グローバル例外ブレークポイントを設定した後、例外が生成されたときに呼び出しスタックに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の欠陥があるようです:(

于 2012-10-22T18:48:46.607 に答える
3

また、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]];

欠点としては、コンパイラの警告が発生しますが、ここには実際にバグがありますが、私たちのバグではありません。

于 2013-04-19T01:53:28.683 に答える
1

今のところ、私はビルの答えに従ってこれを使用します:

// 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
于 2013-06-18T04:29:40.597 に答える