2009-08-18 68 views
1

任何人都可以幫助我如何使UIPickerView在最後一行的值後顯示第一行的值,就像UIDatePicker之後的第一個1所示。UIPickerView:最後一個值後面跟着第一個值

感謝

+0

你想使它成爲循環?我試圖找到答案,稍後再回來查看,也許我會弄清楚。 – mk12 2009-08-18 03:23:42

+0

查看http://stackoverflow.com/questions/214441/how-do-you-make-an-uipickerview-component-wrap-around – squelart 2009-08-18 03:50:33

回答

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中的字符串數量,它仍然可以正常工作。選定的行選擇最接近中間的「第一個」值。假設在pickerData中有3個NSString,行%[pickerData count]返回以下內容:

 
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])。如果有什麼你不明白的或者我錯過了什麼,請發表評論。 希望這有助於!

+0

感謝您的回覆。但它會創建1000000行,並且如果我將UIImages添加到該行,它是否會造成內存/性能問題。 – edie 2009-08-18 06:31:15

+1

我相信,只有可見的行纔會被加載,並且cells/rows /無論它們被稱爲UIPickerViews,都應該被重用。 – 2009-08-18 11:58:17

+0

是的,不會有內存/性能問題。 – mk12 2009-08-18 14:32:06

0

我做了一個基於UIScrollView的循環tableView。並基於這個tableView,我重新實現了UIPickerView。您可能對此DLPickerView感興趣。這個選擇器視圖具有UIPickerView所具有的所有功能,但也提供了許多新功能,並且定製此選取器視圖更容易。

https://github.com/danleechina/DLPickerView

並且要注意的是這DLPickerView循環滾動真是循環滾動。所有的魔法都是因爲另一個課程DLTableView而發生的。

相關問題