2012-03-26 21 views
0

Ok Ich habe Probleme herauszufinden, wie man das angehen kann.UIPickerView und UITextField erhalten Wert von UIPickerView

Ich habe ein UITextField, das ich dynamisch zu einem UITableView gemäß den Definitionen einer XML-Datei hinzufüge, in der XML-Datei kann ich eine Liste als einen der Datentypen angeben und was ich dann mache, ist eine UIPickerView, die angezeigt wird die Liste zu der inputView meines spezifischen UITextField.

Was ich habe Probleme mit ist es, herauszufinden, wie der ausgewählte Wert aus dem UIPickerView zu nehmen und es auf den Text Eigenschaft meiner UITextField hinzufügen

Mein UIPickerView ist eine benutzerdefinierte Klasse, aber ich hinzugefügt keine zusätzliche Funktionalität, die ich nur Überschreiben Sie es, um es zu ermöglichen, eine Datenquelle als Eigenschaft an die UIPickerView zu übergeben.

Hier ist meine PickerViewDataSourceAndDelegate.h

#import <Foundation/Foundation.h> 

@interface PickerViewDataSourceAndDelegate : UIPickerView <UIPickerViewDelegate, UIPickerViewDataSource> 

@property (nonatomic, strong) NSMutableArray *pickerData; 

@end 

Und es ist .m-Datei

#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 

Dies ist, wie ich die UITextField mit dem UIPickerView als 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 
      { 
       .... 

Für Leerzeichen Ich habe etwas von dem Platz weggelassen, wenn einige Dinge unklar sind, werde ich gerne erklären.

Alles perfekt ohne Ausnahmen funktioniert, ich will nur aus dem Picker

Antwort

1

Siehe picker view delegate protocol. Implementieren Sie diese Methode:

Hier können Sie den entsprechenden Wert aus dem Modell abrufen und Ihr Textfeld aktualisieren.

Um herauszufinden, welches das aktuelle Textfeld ist, müssen Sie herausfinden, welches der Textfelder der Erstbeantworter ist.

Lassen Sie alle Textfelder in einer IBOutletCollection oder einem Array durchlaufen, durchlaufen Sie sie und suchen Sie den ersten, der zuerst antwortet.

Oder, wenn Sie Textfelddelegaten haben, können Sie ein ivar für das aktuelle Textfeld in der didBeginEditing-Delegate-Methode festlegen, und verwenden Sie dies in der Delegate-Methode Picker-Ansicht oben.

+0

Mein Problem ist, wie kann ich weitergeben es zurück zu meinem textfield, wie ich mehrere textfields haben kann, die Pickerviews in ihrem inputView haben, also kann ich nicht alles dynamisch aufgebaut werden – Armand

+0

Sehen Sie updated answe r – jrturton

+0

Ihre Bearbeitung ist sehr ähnlich zu dem, was ich getan habe, ich werde Ihre Antwort akzeptieren, da sie mich in die richtige Richtung zu dem führt, was ich getan habe. Für den Moment behalte ich es so, wie ich es gemacht habe, bis ich meine Demo gemacht habe, dann kann ich sie noch optimieren. Vielen Dank – Armand

0

Verwenden -[UIPickerView selectedRowInComponent:] um zu bestimmen, um den ausgewählten Wert zu erhalten, welche Zeile ausgewählt ist, und dann wieder das Objekt an diesem Index in Ihrer Datenmatrix.

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





    // Handle the selection 
} 

Geben Sie die Zeichenfolge in das Textfeld

1

ich meine eigene Lösung gefunden, die Worte wie ein Zauber, ich hatte eine delegierte Methode erstellen den Wert wieder auf meine UITextField zu übergeben.

Zuerst habe ich ein Protokoll in meinem PickerViewDataSourceAndDelegate deklariert.h

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

Dann habe ich ein Mitglied:

id <PickerRowSelected> adelegate; 

und habe eine Eigenschaft

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

Ich habe dann diese Funktion

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

Und in dem Controller, enthält das Textfeld, das ich hinzugefügt habe:

pickerDataDel.adelegate = self; 

und umgesetzt mein neues Delegatmethode

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

zu dieser Frage meiner Antwort finden, um die Ansicht zu finden, die den First Responder ist

Find View that is the firstresponder