0

UIPickerView相互に依存する3つのコンポーネントを持つカスタムがあります(つまり、2番目のコンポーネントは最初のコンポーネントで選択されたものに応じて値を表示し、3番目のコンポーネントは1番目と2番目に依存します)。UIPickerViewから表示されている値を取得していますNSDictionary

2つのコンポーネントを同時にスピンすると、アプリがクラッシュすることがある(データをリロードする時間がない)ことを除いて、すべてがうまく機能します。これは私のようにpickerView:didSelectRow:inComponent見えます:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{
    NSLog(@"Selecting row %d component %d", row, component);

    // When A is changed, we need to reload B and C
    if (component == 0) {

        [pickerView reloadComponent:1];
        [pickerView selectRow:0 inComponent:1 animated:YES];

        // need to reload the C after reloading B
        [self pickerView:pickerView didSelectRow:0 inComponent:1];

    }
    else if (component == 1) {
        [pickerView reloadComponent:2];
        [pickerView selectRow:0 inComponent:2 animated:YES];
    }
    [self updateSelection];
}

クラッシュを防ぐために、ユーザーがピッカーの複数のコンポーネントを一度に回転させないようにする方法はありますか?

ありがとう!

4

2 に答える 2

2

didSelectRow:component:あなたが再帰的に呼び出す良い聖なるイエス!

パラメーターを処理する方法によって、パラメーターが2レベルを超える深さになるのを防ぐことができますが、それでもそうしないでください。これまで。

ユーザーが一度に複数のコンポーネントを回転させないようにする方法はありません。マルチタッチとiOSの喜びは、すべてを動かし、すべてが一貫した状態に落ち着くのを見ることができることです。また、スピナーコンポーネントは落ち着くまでに時間がかかるため、ユーザーは1本の指ですべてのコンポーネントをatwitterに設定できます。それに応じてコードを書くことを学ぶ必要があります。

この場合、didSelectRow:component:それ自体の内部からのすべての呼び出しを削除する必要があります。これは、システムによってのみ呼び出されます。あなたはあなたの使用で正しい軌道に乗っていますreloadComponent:、それはあなたがそれらの十分なリロードをしていないということだけです:

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    NSLog(@"Selecting row %d component %d", row, component);

    [self updateSelection];

    // When A is changed, we need to reload B and C
    if (component == 0) {
        [pickerView reloadComponent:1];
        [pickerView reloadComponent:2];
    } else if (component == 1) {
        [pickerView reloadComponent:2];
    }
}

あなたが何をしているのかわかりませんupdateSelection-おそらくそれはの値に基づいてデータモデルを設定しますpickerView。これは問題ありませんが、メソッドの先頭で発生する必要があるため、titleForRowまたはviewForRowが呼び出されたときに、適切なデータから選択できます。また、これら3つの(、、)のいずれからでもupdate、ピッカーに値をアサートしないtitleForでください。それから読んでください。viewFor

これはあなたにとって良い出発点だと思いますが、目標に近づくにつれて、あちこちで少し調整する必要があります。didSelectRow:component:ピッカーの鍵は、コンポーネントスピナーのいずれかが値に落ち着いたときにのみアサートすることであり、リロードしてもスピンを継続できることは非常に優れていることがわかると思います。これを試してみて、ある程度の進歩が見込めるかどうかを確認し、行き詰まった場合は返信してください。

于 2012-04-18T12:34:17.433 に答える
0

一度に2つのホイールを回転させると、マルチタッチが有効になりますよね?したがって、可能性としては、マルチタッチを無効にして、ユーザーがUIPickerViewの1つのホイールだけに触れて影響を与えるように制限することが考えられます。

これが役立つかもしれないリンクです。

于 2012-04-17T20:25:12.427 に答える