1

私のアプリは、いくつかの異なるビューでUIStepperコントロールを使用しています。これらのビューにまったく影響を与えないようにアプリのマイナーアップデートをリリースし、アプリ内のすべてのUISteppersが無効になっているというレポートを受け取り始めました。1人のユーザーがスクリーンショットを送信すると、ステッパーコントロールは、有効なプロパティがNOに設定されているように見えます。ただし、コード内にこのプロパティを設定する場所はまったくなく、デフォルトはYESです。「有効」という用語のインスタンスをアプリで検索して、誤って無効にしていないことを確認しましたが、そうではありません。

おそらく、enabledプロパティのデフォルト値がiOSのバージョン間で変更されていると思いましたが、これを報告したユーザーは、私の開発デバイスと同じiOS5.1.1を実行しています。そして、私はこのアプリのアップデートの問題について聞き始めただけです。

enabledプロパティを設定する以外に、最小値と最大値を同じ値に設定すると、ステッパーが無効になることがわかりました。私はこれが私のアプリで起こっていないことをかなり確信しています。値はハードコーディングされてセットアップメソッドに渡されます。多くのアプリバージョンが前からこのコードを変更していません。

これが起こる他の理由を知っていますか?自分で問題を再現することはできず、一部のユーザーにしか影響しないため、トラブルシューティングが困難です。

UISteppersを作成するための私のコードは次のとおりです。

- (UIStepper *)makeStepperInput:(float )currentValue minValue:(float)minValue maxValue:(float)maxValue increment:(float)increment {
    int stepperWidth = 94;
    int stepperHeight = 27;
    CGRect stepperFrame = CGRectMake(0, 0, stepperWidth, stepperHeight);

    UIStepper *stepperInput = [[[UIStepper alloc] initWithFrame:stepperFrame] autorelease];
    stepperInput.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;

    [stepperInput setValue:currentValue];
    [stepperInput setMinimumValue:minValue];
    [stepperInput setMaximumValue:maxValue];
    [stepperInput setStepValue:stepValue];
    [stepperInput setContinuous:NO];

    NSLog(@"making stepper with values %f, %f, %f, %f (%i)", currentValue, minValue, maxValue, stepValue, stepperInput.enabled);

    [stepperInput addTarget:self action:@selector(onChange:) forControlEvents:UIControlEventValueChanged];

    return stepperInput;
}

更新:上記のNSLog行を使用してデバッグバージョンをインストールすることをいとわないユーザーがいます。彼は私にコンソール出力を送信し、ステッパーの最小値と最大値が正しく(1つのケースでは1と20)、有効なプロパティがYESであることを示しています。残念ながら、それはここで何が起こっているのかについての私の理論の両方を排除します...

4

1 に答える 1

1

さて、これが起こったことです。上に投稿されたメソッドは、私の実際のメソッドの簡略化されたバージョンであり、iOS5より前のデバイスにいくつかの分岐を提供します。iOS 5より前のサポートを支援するために、私は実際にstepperInputをUIControlとして宣言し、UIStepperをサポートしていないiOSバージョンでは別のものを返していました。

今、興味深い部分です。プロジェクトをロールバックしてビルド設定を確認し始めました。前回のリリースの前に、Xcodeからビルド設定が古くなっているというアラートメッセージの1つが表示されたことを思い出しました。ボタンをクリックして、Xcodeが推奨されるすべての変更を行えるようにしました。今回は、一度に1つの変更を実行し、変更するたびにアプリをテストしました。

推奨される最初の変更は、「コンパイラー構成をLVVMにアップグレードする」ことでした。(「コンパイラ構成は「com.apple.compilers.llvmgcc42」に設定されています。これにより、iOSターゲットの推奨設定である「AppleLLVMコンパイラ4.0」にアップグレードされます。」)変更を加えるとすぐに、問題が発生します。テストデバイスに表示されました。したがって、古いコンパイラではUIControlとして宣言されたオブジェクトにUIStepperプロパティを設定できたようですが、新しいコンパイラではできませんでした。実際、上記のNSLog行を変更して、メソッドに渡された値ではなく、ステッパーの実際の値を出力すると、すべて0が返されました。最小値と最大値の両方を0に設定すると、ステッパーは次のように見えます。無効。

再現できなかったため、すべてのユーザーに影響があるとは思いませんでしたが、リリースで使用したビルド設定ではなく、古いビルド設定でテストしていました。だから今、これはおそらくすべてのユーザーに影響を与えると思います、そして一部のユーザーだけがそれに気づいています。

とにかく、解決策はコードを再編成して、UIStepperを実際のUIStepperとして宣言できるようにすることです。これは、新しいコンパイラーでは、以前行っていたような混乱が許可されていないためです。

于 2012-09-05T01:19:53.087 に答える