0

1 つのピッカーを含む ViewController を作成しました。そのビューがトリガーされ、スーパービューで押された 4 つのボタンのいずれかに応じて、4 つのデータ配列の 1 つがピッカーに表示され、入力されます。サブビューに というintプロパティを指定pickerTypeし、ボタン コード内で次のように設定しました。

    - (IBAction)chooseDepType:(id)sender
    {

        if (pickerView==nil)
        {
           pickerView = [[Picker alloc] initWithNibName:@"Picker" bundle:nil];
           //send message to next view telling which array to load in picker
           pickerView.pickerType=1;
        }
        [self.view addSubview:pickerView.view];
    }

pickerTypeが異なる値に設定されていることを除いて、他のボタン メソッドは同じように見えます。次に、サブビューで、データソースとデリゲート メソッドを次のように設定します。

   -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
    {
        if(pickerType_ ==1)
        {
            // return the appropriate number of components, for instance
            return 1;
        }
    }

私が抱えている問題は、各ボタンのコードで新しい値に設定しているにもかかわらずpickerView、サブビューが値が変更されたことを認識していないことです。基本的に、どのボタンを押しても、最初に押したボタンに対応するデータで満たされたピッカーが表示されます。さらに複雑なことに、おそらく、スーパービューはマスター/ディテール テンプレートの詳細ビューです。

pickerTypeプロパティは次のように作成されます。

    @property (assign) int pickerType;

    @synthesize pickerType=pickerType_;

ARCを使用しています。これが私の愚かなプログラミング エラーなのか、それともビューのライフサイクルと関係があるのか​​ はわかりません。

4

3 に答える 3

1

あなたPickerがすでに作成されているかどうかを確認しているので:

if (pickerView==nil)

タイプを設定する前に:

    pickerView.pickerType=1;

次にボタンを押すと、pickerView既に存在する場合、実行は の本体をスキップしif、タイプは変更されません。

これを修正するには、型設定ステートメントをifブロックの外に移動します。

ちなみに、ほぼ同じことをする 4 つのボタンがある場合は、それらすべてを同じようにトリガーし、それらのプロパティIBActionによってどちらが押されたかを区別することができます。tag

- (IBAction)showPicker: (id)sender
{
    if (pickerView==nil)
    {
       pickerView = [[Picker alloc] initWithNibName:@"Picker" bundle:nil];
    }
    // Each button's tag could correspond exactly to the appropriate pickerType,
    // or have any other meaning you choose.
    [pickerView setPickerType:[sender tag]];
    [self.view addSubview:pickerView.view];
}
于 2012-10-05T18:15:21.703 に答える
0

が nil でない場合pickerView、プロパティを変更せずに、そのビューを現在のコントローラーのサブビューにするだけです (他のコードがそれを削除していない場合は、既にそうです)。

于 2012-10-05T18:16:22.060 に答える
-1

新しいタイプを割り当てた後、[pickerViewreloadAllComponents]を呼び出してみてください。

于 2012-10-05T19:20:12.277 に答える