2012-03-26 9 views
0

Okこれにアプローチする方法を理解するのに問題があります。UIPickerViewとUITextFieldはUIPickerViewから値を取得します

XMLファイルの定義に従って動的にUITableViewに追加するUITextFieldがあります。データ型の1つとしてリストを指定することができます。次に、表示するUIPickerViewを追加します私の特定のUITextFieldのinputViewへのリスト。

私はとのトラブルを抱えていますがUIPickerViewから選択された値を取り、私のUITextFieldの

のtextプロパティに追加する方法を考え出すされて私のUIPickerViewは、カスタムクラスですが、私は私が唯一の余分な機能を追加していませんUIPickerViewにデータソースをプロパティとして渡すことを可能にするためにオーバーライドします。ここで

は私のPickerViewDataSourceAndDelegate.h

#import <Foundation/Foundation.h> 

@interface PickerViewDataSourceAndDelegate : UIPickerView <UIPickerViewDelegate, UIPickerViewDataSource> 

@property (nonatomic, strong) NSMutableArray *pickerData; 

@end 

であり、これは私がスペースの場合inputView

for(NodeProperty *nodeproperty in node.properties) 
    { 
     if(nodeproperty.flowDirection == (FlowDirection*)Output) 
     { 
      if([nodeproperty.typeName isEqualToString:@"System.String"] && nodeproperty.extendedType == (ExtendedType*)None && [nodeproperty.enumValues count] == 0) 
      { 
       ... 
      } 
      else if([nodeproperty.typeName isEqualToString:@"System.String"] && nodeproperty.extendedType == (ExtendedType*)MultilineText && [nodeproperty.enumValues count] == 0) 
      { 
       ... 
      } 
      else if([nodeproperty.typeName isEqualToString:@"System.Boolean"] && nodeproperty.extendedType == (ExtendedType*)None && [nodeproperty.enumValues count] == 0) 
      { 
       ... 
      } 
      else if([nodeproperty.typeName isEqualToString:@"System.Double"] && nodeproperty.extendedType == (ExtendedType*)None && [nodeproperty.enumValues count] == 0) 
      { 
       ... 
      } 
      else if([nodeproperty.typeName isEqualToString:@"System.String"] && nodeproperty.extendedType == (ExtendedType*)None && [nodeproperty.enumValues count] > 0) 
      { 
       UILabel *fieldLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 290, 20)]; 
       fieldLabel.text = nodeproperty.name; 
       [rowsInSectionLabels addObject:fieldLabel]; 

       PickerViewDataSourceAndDelegate *pickerDataDel = [[PickerViewDataSourceAndDelegate alloc] init]; 

       pickerDataDel.pickerData = nodeproperty.enumValues; 
       pickerDataDel.dataSource = pickerDataDel; 
       pickerDataDel.delegate = pickerDataDel; 

       UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(5, 25, 290, 30)]; 
       [textField setBorderStyle:UITextBorderStyleRoundedRect]; 
       textField.inputView = pickerDataDel; 
       [rowsInSection addObject:textField]; 
      } 
      else 
      { 
       .... 

としてUIPickerViewでのUITextFieldを追加する方法です

#import "PickerViewDataSourceAndDelegate.h" 

@implementation PickerViewDataSourceAndDelegate 

@synthesize pickerData; 

-(id)init { 
    if (self = [super init]) 
    { 
     self.pickerData = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView { 

    return 1; 
} 

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component { 
    return [self.pickerData count]; 
} 

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    return [self.pickerData objectAtIndex:row]; 
} 

@end 

.Mファイルです私はいくつかのスペースを省略しました。もし明確でないものがあるなら、私は喜んで説明します。すべてのものは例外なく完璧に動作

は、私は選択された行を決定するために使用-[UIPickerView selectedRowInComponent:]

答えて

1

picker view delegate protocolを参照してください。このメソッドを実装します。

ここでは、モデルから適切な値を取得し、テキストフィールドを更新できます。

現在のテキストフィールドを調べるには、どのテキストフィールドが最初のレスポンダであるかを調べる必要があります。

IBOutletCollectionまたは配列のすべてのテキストフィールドを繰り返し、最初の応答者であるテキストフィールドを探します。

テキストフィールドデリゲートがある場合は、didBeginEditingデリゲートメソッドの現在のテキストフィールドにivarを設定し、上記のピッカービューデリゲートメソッドでこれを使用できます。

+0

あるビューを見つけるために、この質問に私の答えを参照してください。それは私のテキストフィールドに戻ります。私はinputViewにpickerviewsを持つ複数のテキストフィールドを持つことができるので、すべてが動的に構築されるわけではありません。 – Armand

+0

更新されたansweを見てくださいr – jrturton

+0

あなたの編集は私がやり遂げたことと非常にシンプルです。私がやったことを正しい方向に導いてくれるので、私はあなたの答えを受け入れます。今のところ、私は私のデモをやるまで、私がやったやり方にしておきます。ありがとう – Armand

0

ピッカーのうち、選択された値を取得して、あなたのデータ配列内のそのインデックスにあるオブジェクトを返すようにしたいです。

0
- (void)pickerView:(UIPickerView *)pickerView1 didSelectRow: (NSInteger)row inComponent:(NSInteger)component { 
    NSInteger selectedRow = [pickerView1 selectedRowInComponent:0]; 
    NSString *selectedPickerRow=[yourArrayOfElements objectAtIndex:selectedRow]; 





    // Handle the selection 
} 

私はその魅力のような言葉に私自身の解決策を見つけたテキストフィールドに

1

を文字列を渡し、私は戻って私のUITextFieldに値を渡すために、デリゲートメソッドを作成する必要がありました。

まず、私は自分のPickerViewDataSourceAndDelegateでプロトコルを宣言しました。H

@protocol PickerRowSelected 
-(void) selectedARowAndValueIs:(NSString*)aValue; 
@end 

は、その後、私はメンバー追加:

id <PickerRowSelected> adelegate; 

および

@property (nonatomic, strong) id<PickerRowSelected> adelegate; 

プロパティを追加して私は、

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    [adelegate selectedARowAndValueIs:[self.pickerData objectAtIndex:row]]; 
} 

そして含まコントローラにこの機能を追加しました私が追加したテキストフィールド:

pickerDataDel.adelegate = self; 

そして

-(void) selectedARowAndValueIs:(NSString *)aValue 
{ 
    UITextField *aview = (UITextField*)[self.view findViewThatIsFirstResponder]; 
    aview.text = aValue; 
} 

私の新しいデリゲートメソッドを実装私の問題は、私は合格しない方法ですファーストレスポンダ

Find View that is the firstresponder

関連する問題