2014-01-17 2 views
10

Ich habe ein Profilformular als Teil einer Registrierung für eine iOS App.iOS - Füllen Sie eine statische UIPickerView

Ich würde gerne ein Drop-Down-Menü für Elemente wie Geschlecht, Titel, DOB usw. verwenden. Die Daten für jede wird statisch sein - ich werde die UIPickerView zu implementieren - aber meine Frage ist - brauche ich um Arrays und Datendelegaten zu erstellen, um jeden einzelnen Picker zu füllen, oder gibt es eine einfachere Möglichkeit, statische Daten anzuwenden?

+0

Nein, Sie benötigen Delegaten und Arrays. Es gibt keine Abkürzung. – rmaddy

+0

Wenn Sie es mehrmals in Ihrer App benötigen, könnten Sie eine benutzerdefinierte Klasse erstellen, die UIPickerViewDataSource und UIPickerViewDelegate implementiert, die ein Array als Init-Argument akzeptiert und den Rest intern behandelt. – rist

+0

Es gibt einen Unterschied zwischen 'IOS' (http: //en.wikipedia. org/wiki/Cisco_IOS) und 'iOS' (http://en.wikipedia.org/wiki/IOS) formulieren Sie bitte Ihre Frage richtig. – Popeye

Antwort

14

Können Sie es ohne einen Delegierten tun?

Können Sie es ohne ein Array tun? Ja, aber du solltest nicht.

Hier ist ein Beispiel ohne ein Array (von http://cocoamatic.blogspot.com/2010/08/create-uipickerview-programmatically.html).

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { 
    // Handle the selection 
} 

// tell the picker how many rows are available for a given component 
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    NSUInteger numRows = 3; 

    return numRows; 
} 

// tell the picker how many components it will have 
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
return 1; 
} 

// tell the picker the title for a given component 
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    NSString *title; 

    title = [@"" stringByAppendingFormat:@"Row %d",row]; 

    return title; 
} 

// tell the picker the width of each row for a given component 
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component { 
int sectionWidth = 300; 

return sectionWidth; 
} 

Allerdings sollten Sie nur ein Array verwenden, es macht es so viel einfacher zu lesen und zu pflegen. Wenn Sie einen zusätzlichen Wert hinzufügen möchten, fügen Sie ihn einfach zu Ihrem Array hinzu. Anstatt an mehreren Stellen zu aktualisieren, fügen Sie einfach einen anderen Wert zu Ihrem Array hinzu. Auch viel einfacher zu verstehen.

@implementation PickerViewController 
. 
. 
- (void)viewDidLoad { 
     [super viewDidLoad]; 
     _myArray = @[@"Row 1", @"Row 2", @"Row 3",]; 
} 

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { 
    // Handle the selection 
} 

// tell the picker how many rows are available for a given component 
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    NSUInteger numRows = 3; 

    return _myArray.count; 
} 

// tell the picker how many components it will have 
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
return 1; 
} 

// tell the picker the title for a given component 
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    NSString *title; 

    title = myArray[row]; 

    return title; 
} 

// tell the picker the width of each row for a given component 
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component { 
int sectionWidth = 300; 

return sectionWidth; 
} 

Wenn Sie mehrere Kommissionierer hätten, würden Sie nur mehrere Arrays verwenden und jede picker überprüfen, um zu sehen, welche Sie hatte seit der picker in jedem der aufgelisteten Funktionen übergeben wird.

@implementation PickerViewController 
. 
. 
- (void)viewDidLoad { 
     [super viewDidLoad]; 
     _myArray1 = @[@"Row 1", @"Row 2", @"Row 3",]; 
     _myArray2 = @[@"Row 1-2", @"Row 2-2", @"Row 3-2", @"Row 4-2"];  

     UIPickerView pickerView1 = [[UIPickerView alloc] init]; 
     UIPickerView pickerView2 = [[UIPickerView alloc] init];  
} 

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { 
    // Handle the selection 
    if (pickerView == pickerView1) 
    { 
     // First Picker 
    } 
    else if (pickerView == pickerView2) 
    { 
     // First Picker  
    } 
} 

// tell the picker how many rows are available for a given component 
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    if (pickerView == pickerView1) 
    { 
     // First Picker 
     return _myArray1.count; 
    } 
    else if (pickerView == pickerView2) 
    { 
     // Second Picker  
     return _myArray2.count; 
    }  

    // A third picker passed in somehow 
    return 0; 
} 

// tell the picker how many components it will have 
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
    if (pickerView == pickerView1) 
    { 
     // First Picker 
     return 1; 
    } 
    else if (pickerView == pickerView2) 
    { 
     // Second Picker  
     return 1; 
    }  

    // A third picker passed in somehow 
    return 0; 
} 

// tell the picker the title for a given component 
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    NSString *title; 

    if (pickerView == pickerView1) 
    { 
     // First Picker 
     title = myArray1[row]; 
    } 
    else if (pickerView == pickerView2) 
    { 
     // Second Picker  
     rtitle = myArray2[row]; 
    }  

    return title; 
} 

// tell the picker the width of each row for a given component 
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component { 
    if (pickerView == pickerView1) 
    { 
     // First Picker 
     return 300; 
    } 
    else if (pickerView == pickerView2) 
    { 
     // Second Picker  
     return 400; 
    }  

    // A third picker passed in somehow 
    return 0; 
} 
+0

cool prost @ansible - könnte ich die Array-Methode mit mehreren Uipickern auf der gleichen Seite verwenden? – Dancer

+1

@Dancer - Ja - hinzugefügt ein Beispiel in meiner Antwort von zwei Pflückern. Die gleiche Idee gilt für mehrere UITableViews, UITextBox ... in iOS. – ansible

+0

erstklassig - vielen Dank für Ihre Hilfe @ansible – Dancer