views:

76

answers:

2

As seen in UIDatePicker you can scroll up endlessly (as well as down for that matter). I want to accomplish that too, because I want people to select a date such as:

1 January, 2010 2 January, 2010 ... 30 December, 2010 31 December, 2010 1 January, 2011 ..

So it can go on forever. How would I accomplish this? Since I can only give a specific amount of rows in the delegate.

A: 

High level: Specify some finite number of rows in your delegate. Then detect as you get toward the top or bottom of those rows and change the delegate so the row is actually in the middle (or top, or whatever). You would obviously need to change the table's location by using one of the scrolling methods (presumably without animation so it happens without the user knowing).

Make sense? I've never done this, but it should be theoretically possible.

livingtech
A: 

I don't think you can actually make the UIPickerView loop, but the way I've done it in the past is to return a really large number from numberOfRowsInComponent and then calculate the modulus of the row to return the appropriate view from viewForRow, like this:

// picker data source:
-(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger) component
{
    // to make it look like the picker is looping indefinetly,
    // we give it a really large length, and then in the picker delegate we consider
    // the row % (actual length) instead of just the row.
    return INT16_MAX;
}


// picker delegate:
-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger) row forComponent:(NSInteger) component reusingView:(UIView *)view
{
    // to make it look like the picker is looping indefinetly,
    // we give it a really large length in the picker data source, and then we consider
    // the row % actual_length instead of just the row.
    row = row % actual_length;
    // where actual length is the number of options that will be looping

    // ... do whatever
}

and in your initialization:

- (void)viewDidLoad {
    [super viewDidLoad];

    // ... whatever other initialization... 

    // to make it look like the picker is looping indefinetly ,
    // we give it a really large length in the picker data source, and then we consider
    // the row % actual_length instead of just the row, 
    // and we start with the selection right in the middle, rounded to the
    // first multiple of actual_length so we start the selection on 
    // the first option in the list.
    [myPicker selectRow:(INT16_MAX/(2*actual+length))*actual_length inComponent:0 animated:NO];
}
filipe