2009-08-18 7 views
1

Quelqu'un peut-il m'aider à faire en sorte que UIPickerView affiche la valeur de la première rangée après la valeur de la dernière rangée, tout comme l'UIDatePicker où, après 12, le 1 suivra.UIPickerView: dernière valeur suivie de la première valeur

Merci

+0

Vous voulez le rendre circulaire? J'essaie de trouver une réponse, revenez plus tard peut-être que je l'aurai compris. – mk12

+0

Voir http://stackoverflow.com/questions/214441/how-do-you-make-an-uipickerview-component-wrap-around – squelart

Répondre

5

Je ne pense pas que son possible de faire vraiment circulaire, mais vous pouvez truquer.

#define kRowsInPicker 10000 

- (void)viewDidLoad { 
    NSArray *localPickerData = [[NSArray alloc] initWithObjects: 
           @"Ottawa", @"Toronto", @"Montreal", @"Winnipeg", 
           @"Saskatchewan", @"Iqaluit", @"Edomonton", nil]; 
    [self setPickerData:localPickerData]; 
    [localPickerData release]; 

    UIPickerView *localPicker = [[UIPickerView alloc] initWithFrame: 
           CGRectMake(0, 0, 320, 216)]; 
    [localPicker setDelegate:self]; 
    [localPicker setDataSource:self]; 
    localPicker.showsSelectionIndicator = YES; 
    NSInteger selectedRow = 0; 
    [localPicker selectRow:(((NSInteger)((kRowsInPicker/2)/[pickerData count])) * [pickerData count]) + (selectedRow%[pickerData count]) inComponent:0 animated:NO]; 
    [self setPicker:localPicker]; 
    [localPicker release]; 

    [[self view] addSubview:picker]; 
    [super viewDidLoad]; 
} 
#pragma mark - 
#pragma mark UIPickerViewDataSource methods 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
    return 1; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView 
           numberOfRowsInComponent:(NSInteger)component { 
    // usually "return [pickerData count];" 
    return kRowsInPicker; // 10,000 is good, if you add a few more zeros 
          // there seems to be problems. 
} 

#pragma mark - 
#pragma mark UIPickerViewDelegate methods 

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

Vous pouvez modifier le nombre de chaînes dans pickerData et cela fonctionnera toujours correctement. La ligne sélectionnée sélectionne la "première" valeur la plus proche du milieu. row% [pickerData count] renvoie les éléments suivants en supposant qu'il y ait 3 NSStrings dans pickerData:

 
ROW    RETURNS 
0    0 
1    1 
2    2 
3    0 
4    1 
5    2 
6    0 
7    1 
8    2 
etc...
Il va juste parcourir 0 à travers la longueur du tableau. Le truc confus dans viewDidLoad choisit juste une valeur aussi proche du milieu que possible en utilisant l'index de l'élément du tableau que vous fournissez dans selectedItem. Il n'y a pas de perte de performance ou de fuite de mémoire, tout ce que vous avez alloué est le seul tableau. Chaque fois que vous accédez à leur choix, utilisez ([localPicker selectedRowInComponent: 0]% [pickerData count]). S'il y a quelque chose que vous ne comprenez pas ou quelque chose que j'ai manqué, veuillez commenter. J'espère que cela a aidé!

+0

Merci pour la réponse. Mais cela va-t-il créer des rangées de 1000000, et si j'ajoute UIImages à cette ligne, cela créera un problème de mémoire/performance. – edie

+1

Seules les lignes visibles seront chargées, et les cellules/lignes/tout ce qu'elles sont appelées pour UIPickerViews devraient être réutilisées, je crois. –

+0

Oui, il n'y aura pas de problème de mémoire/performance. – mk12

0

J'ai créé une table cyclique basée sur UIScrollView. Et basé sur ce tableauView, je ré-implémente UIPickerView. Vous pourriez être intéressé par ce DLPickerView. Et cette vue de sélecteur a toutes les fonctionnalités que UIPickerView a, mais donne également beaucoup de nouvelles fonctionnalités, et la coutume cette vue de sélecteur est beaucoup plus facile.

https://github.com/danleechina/DLPickerView

Et être conscient que ce DLPickerView défilement cyclique défile vraiment de façon cyclique. Toute la magie est arrivé à cause d'une autre classe DLTableView.