2

2 つの異なるテキスト フィールドに単一の UIPickerview を使用する方法を探しています。各テキストフィールドが選択されたときにピッカービューをポップアップさせたいです。ユーザーがアイテムを選択すると、そのアイテムが特定のテキスト フィールドに入力されます。ピッカーは、選択したテキストフィールドに基づいて入力する必要があります。

私はこれを読みました:

How to use one UIPickerView for multiple textfields in one view?

そしてこれ:

UIPickerViewを使用して1つのビューに異なるテキストフィールドを設定する方法は?

そしてこれ:

テキストフィールド編集に関するUIPickerViewの複数のソース

ただし、完全な解決策はありません。

私は Xcode を初めて使用するので、ストーリーボードを設定する手順も含むソリューションが必要です。

これを何週間も調査してきたので、助けていただければ幸いです。

編集:ここに私のコードがあります:

.h:
#import <UIKit/UIKit.h>

@interface klViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {

IBOutlet UITextField *textField1;
IBOutlet UITextField *textField2;
NSMutableArray *pickerArray1;
NSMutableArray *pickerArray2;
UIPickerView *pickerView;
}
@property(nonatomic,retain) IBOutlet UITextField *textField1;
@property(nonatomic,retain) IBOutlet UITextField *textField2;
@property(nonatomic,retain) IBOutlet UIPickerView *pickerView;


@end

.m:
#import "klViewController.h"

@interface klViewController ()

@end

@implementation klViewController
@synthesize pickerView;
@synthesize textField1;
@synthesize textField2;
int variabla;

-(void)textFieldDidBeginEditing:(UITextField *)textField{
    [pickerView setHidden:YES];
    if (textField1.editing == YES) {
        [textField1 resignFirstResponder];
        [pickerView setHidden:NO];
        variabla = 1;
    }else if (textField2.editing == YES) {
        [textField2 resignFirstResponder];
        [pickerView setHidden:NO];
        variabla = 2;
    }
    NSLog(@"variabla %d",variabla);
    [pickerView reloadAllComponents];
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
{
    return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
{
    if (variabla == 1) {
        return [pickerArray1 count];
    }else if (variabla == 2) {
        return [pickerArray2 count];
    }else {
        return 0;
    }
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
{
    if (variabla == 1) {
        return [pickerArray1 objectAtIndex:row];
    }else if (variabla == 2) {
        return [pickerArray2 objectAtIndex:row];
    }else {
        return 0;
    }
}
- (void)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [pickerView setHidden:YES];
    pickerArray1 = [[NSMutableArray alloc] initWithObjects:@"0", @"1", @"2", nil];
    pickerArray2 = [[NSMutableArray alloc] initWithObjects:@"3", @"4", @"5", nil];
}

@end

これが私のストーリーボードのスクリーンショットです:

ストーリーボードのスクリーン ショット

ステータスアップデート:

プログラムを実行すると:
1) ピッカービューが非表示になります。
2) テキストフィールドを選択すると、ピッカービューが表示され、選択したテキストフィールドに応じて正しく入力されます。

2) ピッカーの行が選択されている場合、テキストフィールドは入力されません。


これにより、より多くの洞察が得られることを願っています。

4

4 に答える 4

2

1) テキストフィールドの外側をクリックしても、ピッカーが消えません。

それが起こったときにピッカーを消そうとするコードはありません。シンプルなタップ ジェスチャ レコグナイザーをビューに追加してみてください。viewDidLoadlikeに行を追加します。

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backgroundTap:)]];

次に、次のように単純に関数を実装します。

-(void)backgroundTap:(UITapGestureRecognizer *)tapGR{
    self.pickerView.hidden = YES;
    // And maybe..
    variabla = 0;
}

hidden プロパティを使用してピッカーを表示および非表示にしているため、これは非常に簡単に機能します。これを行うためのより洗練された方法は他にもあります。通常、ピッカーはテキストフィールドのinputViewプロパティとして設定されます。それは調査する価値があります。

2) ピッカーの行が選択されている場合、テキストフィールドは入力されません。

pickerView:didSelectRow:inComponent:ピッカーのデリゲート メソッドを処理していません。これは、ピッカーが回転を停止してアイテムに着地したときに呼び出されるメソッドです。これがユーザーが選択したアイテムであり、複数回呼び出されると想定しないでください。

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    NSString *text = [self pickerView:pickerView titleForRow:row forComponent:component];
    UITextField *current = nil;
    if (variabla == 1) current = self.textField1;
    else if (variabla == 2) current = self.textField2;
    current.text = text;
}

これで実装が機能するはずです。もう 1 つインスタンス変数があり、 or行variablaの直後に中括弧で宣言する必要があります。@interface@implementation

@implementation klViewController {
    int variabla;
}
@synt....
于 2012-10-11T16:08:45.637 に答える
1

選択したテキストフィールドを識別するために、2 つの異なるテキストフィールドのタグを指定します。以下の方法を変更するだけで問題ありません。ホープ・ディス・ワーク

-(void)textFieldDidBeginEditing:(UITextField *)textField  {




if ([textField viewWithTag:100]) {

    [textField resignFirstResponder];
    [self.View1 setHidden:NO];
    variable=1;
}

else if ([textField viewWithTag:101]) {

    [textField resignFirstResponder];
    [self.View1 setHidden:NO];
     variable=2;

}

    [_Picker_view reloadAllComponents];

}

ありがとう :)

于 2015-12-01T13:14:16.710 に答える
0

.h で

@interface TQViewController : UIViewController<UIPickerViewDelegate>
{
    UITextField *textfield;
    UIPickerView *Picker1;
    NSArray *Array1,*Array2;
}
end

と.mで

    - (void)viewDidLoad
    {

        [super viewDidLoad];

        //TextField
        textfield=[[UITextField alloc]initWithFrame:CGRectMake(5,5,310,40)];
        textfield.borderStyle = UITextBorderStyleRoundedRect;
        textfield.backgroundColor=[UIColor whiteColor];
        textfield.textAlignment = UITextAlignmentCenter;
        textfield.placeholder = @"<enter amount>";
        [self.view addSubview:textfield];
textfield1=[[UITextField alloc]initWithFrame:CGRectMake(5,100,310,40)];
        textfield1.borderStyle = UITextBorderStyleRoundedRect;
        textfield1.backgroundColor=[UIColor whiteColor];
        textfield1.textAlignment = UITextAlignmentCenter;
        textfield1.placeholder = @"<enter amount>";
        [self.view addSubview:textfield1];

        // PickerView1
        Array1=[[NSArray alloc]initWithObjects:@"USD",@"INR",@"EUR", nil];
        Picker1=[[UIPickerView alloc]initWithFrame:CGRectMake(0, 50, 320,10)];
        Picker1.delegate=self;
        Picker1.tag=PICKER1_TAG;
        Picker1.showsSelectionIndicator=YES;
        [self.view addSubview:Picker1];
     Array2=[[NSArray alloc]initWithObjects:@"USD",@"INR",@"EUR", nil];
    }
       -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
        {
           if([textfield becomeFirstResponder])
            return [Array1 count];
           if([textfield1 becomeFirstResponder])
            return [Array2 count];
        }
        - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
          NSString *title;
            if([textfield becomeFirstResponder])
            {
                title=[Array1 objectAtIndex:row];  
                return title; 
            }
            ([textfield1 becomeFirstResponder])
            {
                title=[Array2 objectAtIndex:row];  
                return title; 

            }       
        }

        - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
        {

if([textfield becomeFirstResponder])
            {
                //your code 
            }
            ([textfield1 becomeFirstResponder])
            {
                //your code  

            } 
}
于 2012-10-10T05:59:00.523 に答える
0
  1. ヘッダー ファイルで Picker View オブジェクトを宣言したことを確認してください。
  2. ヘッダー ファイルで、UITextFieldDelegate プロトコルをインポートします。

    @interface MyView:UIViewController < UITextFieldDelegate>

  3. IB で、各テキスト フィールドにタグを設定します。

  4. *.m ファイルで、textFieldShouldBeginEditing メソッドを実装し、PickerView 配列のデータ ソースを更新して、すべてのピッカー ビュー コンポーネントをリロードします。

       -(BOOL) textFieldShouldBeginEditing:(UITextField *)textField {
    
       if (textField.tag == 1) {
    
       itemsArray = [[NSArray alloc] arrayWithObjects:@"A", @"B"];
    
       }
    
       if (textField.tag == 2) {
    
           itemsArray = [[NSArray alloc] arrayWithObjects:@"Green", @"Yellow"];
       }
    
       [myPickerView reloadAllComponents];
       }
    
  5. ヘッダー ファイルに UIPickerViewDelegate と UIPickerViewDataSource を必ずインポートしてください。

同じピッカー ビューを必要な数のテキスト フィールドに使用できます。選択したテキスト フィールドに応じてピッカー ビューのコンテンツを変更するには、テキスト フィールドが変更されるたびに、ピッカー ビューのデータ ソースを別の項目に置き換える必要があります。選択してから、ピッカー ビュー コンポーネントをリロードします。

残念ながら、ここで説明するのは少し複雑です。オブジェクトのタグ値は、IB プロパティ メニューで設定できます。PickerView をビューにドラッグして選択したら、[オブジェクト プロパティ] メニュー (横) でタグ属性を変更できます。簡単なピッカー ビューまたはテーブル ビュー (これらは互いに非常によく似ています) をセットアップする方法を示すチュートリアルを探す必要があると思います。簡単に言うと、すべてのピッカー ビューはデータ ソースから情報を取得します。文字列を含む配列を作成し、ピッカー ビューに配列内の各項目を行としてロードさせることができます。初心者向けの情報を掲載した小さなウェブサイトがあります。チェックしてみてください。
http://i-tutor.weebly.com/index.html

于 2012-10-10T07:59:40.437 に答える