2012-02-09 134 views
0

我有一個選擇器視圖,用戶正在輸入一個時間。當他們向下滾動到23小時時,我想要小時零作爲下一個項目出現,並且要重新開始序列。我怎樣才能做到這一點?如何製作「無限」的UIPickerView?

這是我目前的選擇器視圖的數據源:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
    return 3; 
} 
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    NSArray *sectionContents = [[self dataForDatapickerRows] objectAtIndex:component];  
    NSInteger rows = [sectionContents count];  
    NSLog(@"component %d rows is: %d",component,rows);  
    return rows; 
} 
- (NSString *)pickerView:(UIPickerView *)pickerView 
      titleForRow:(NSInteger)row 
      forComponent:(NSInteger)component { 
    self.dataPickerInstance.backgroundColor=[UIColor whiteColor];  
    return ([[[self dataForDatapickerRows ]objectAtIndex:component] objectAtIndex:row]); 
} 

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    if(component==0) 
    { 
     [self setHou:(NSInteger*)[[[self dataForDatapickerRows ]objectAtIndex:component] objectAtIndex:row]]; 
    } 
    else if(component==1) 
    { 
     [self setMinut:(NSInteger*)[[[self dataForDatapickerRows ]objectAtIndex:component] objectAtIndex:row]]; 
    } 
    else if(component==2) 
    { 
     [self setSecon:(NSInteger*)[[[self dataForDatapickerRows ]objectAtIndex:component] objectAtIndex:row]]; 
    } 

    NSLog(@"%@",[[[self dataForDatapickerRows ]objectAtIndex:component] objectAtIndex:row]); 
} 


- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{ 
    UILabel* tView = (UILabel*)view; 

    if (!tView){ 
     tView = [[UILabel alloc] init]; 
     [tView setFrame:CGRectMake(0, 0, 90,60)]; 
     tView.self.textColor=[UIColor whiteColor]; 
     tView.minimumFontSize = 80; 
     tView.textAlignment=UITextAlignmentCenter; 
     tView.adjustsFontSizeToFitWidth = YES; 
     tView.autoresizesSubviews=YES; 
     tView.font = [UIFont boldSystemFontOfSize:40]; 
     tView.backgroundColor = [UIColor blackColor]; 


     //tView.highlightedTextColor=[UIColor greenColor]; 
     // factLabel.frame = CGRectMake(factLabel.frame.origin.x, factLabel.frame.origin.y, factLabel.frame.size.width, lLabelSIze.height); 
     // 
     // Setup label properties - frame, font, colors etc 
    } // Fill the label text here 
    tView.text=[[[self dataForDatapickerRows ]objectAtIndex:component] objectAtIndex:row]; 

    return tView; 
} 

enter image description here

回答

6

我有一個自定義的時間選擇器(UIPickerView),爲此委託看起來是這樣的:

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ 
    return 4; // it's with am/pm in my case 
} 
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ 
    /// 18000 is divisible with 12, 24 (for the hour) and 60 (for the minutes and seconds) 
    /// it can still get to the end.. but will need a lot of scrolling 
    /// I set the initial value between 9000 and 9060 
    if (component==0) { // hour 
     return 18000; 
    } 
    if (component==3) { // am/pm 
     return [_datasource count]; 
    } 
     // seconds and minutes - could use 45000 so it repeats the same number of time as the hours 
    return 18000; 
} 
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 
    if (component==3) { // am/pm 
     return [_datasource objectAtIndex:row]; 
    } 
    if (component==0) { // hour 
     return [NSString stringWithFormat:@"%d", row%12]; 
    } 
    return [NSString stringWithFormat:@"%02d", row%60]; 
} 
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ 
    if (component==3) { // am/pm 
     if (row==0&&_h>11) { 
      _h-=12; 
     } 
     if (row==1&_h<12) { 
      _h+=12; 
     } 
    } 
    else if(component==0){ 
     _h=row%12; 
     if ([self selectedRowInComponent:3]==1) { // handle am/pm 
      _h+=12; 
     } 
    } 
    else if(component==1){ 
     _m=row%60; 
    } 
    else if(component==2){ 
     _s=row%60; 
    } 
} 
-(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{ 
    // set the size for components 
    if (component<3) { 
     return 50; 
    } 
    return 70; 
} 
+0

喜的朋友,首先我要表示感謝,以you.In你的代碼,我需要增加行數到18000,但我只需要24小時和60秒的第二和分鐘,然後我需要做的。你有什麼想法嗎?請分享 – Spynet 2012-02-09 08:23:04

+0

首先,從所有方法中刪除最後一個組件(am/pm)。然後,你需要爲你的需要修改'pickerView:titleForRow:forComponent:'(例如:在0-23之間使用'[NSString stringWithFormat:@「%d」,row%24]',要使用1到24之間的值,請使用'[NSString stringWithFormat:@「%d」,row%24 + 1]')。秒和分鐘的值只能在0到59之間。請檢查user792677後的鏈接,它可能會更好地解釋(它使用相同的想法,並在選擇新值後滾動到中間)。 – 2012-02-09 08:37:54

+0

oh ..你還需要修改'pickerView:didSelectRow:inComponent:'返回相同的值(刪除第一個if - am/pm - at'component == 0''_h'(hour)將是row %24(或行%24 + 1,取決於你如何在'titleForRow:'方法中使用它) – 2012-02-09 08:47:24