UIPickerView:最后一个值后跟第一个值

时间:2009-08-18 02:04:50

标签: iphone objective-c uipickerview

任何人都可以帮助我如何使UIPickerView在最后一行的值之后显示第一行的值,就像UIDatePicker在12之后的那一行将会跟随。

谢谢

2 个答案:

答案 0 :(得分:5)

我认为它不可能真正使它循环,但你可以伪造它。

#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]];
}

您可以更改pickerData中的字符串数量,它仍然可以正常工作。所选行选择最接近中间的“第一”值。 row%[pickerData count]返回以下假设,假设pickerData中有3个NSStrings:

ROW             RETURNS
 0                0
 1                1
 2                2
 3                0
 4                1
 5                2
 6                0
 7                1
 8                2
 etc...
它只会循环0到数组的长度。 viewDidLoad中令人困惑的东西只是使用您在 selectedItem 中提供的数组项的索引选择尽可能接近中间的值。没有性能损失或内存泄漏,您分配的只是单个阵列。每当您访问他们选择的选项时,请使用([localPicker selectedRowInComponent:0]%[pickerData count])。如果你有什么不明白的东西或我错过的东西,请评论。 希望这有帮助!

答案 1 :(得分:0)

我基于UIScrollView创建了一个循环表。基于此tableView,我重新实现了UIPickerView。您可能对此DLPickerView感兴趣。此选择器视图具有UIPickerView所具有的所有功能,但也提供了许多新功能,并且自定义此选择器视图更加容易。

https://github.com/danleechina/DLPickerView

请注意,这个DLPickerView循环滚动实际上是在循环滚动。所有的魔法都是因为另一个班级DLTableView而发生的。