2012-02-09 15 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

+0

を共有してください。まず、すべてのメソッド(am/pm)の最後のコンポーネントを削除します。次に、あなたのニーズに合わせて 'pickerView:titleForRow:forComponent:'を変更する必要があります(例えば、 'NSString stringWithFormat:@"%d "、row%24" 'を使用して0〜 1と24の間の値をとるには '[NSString stringWithFormat:@"%d "、行%24 + 1]'を使用します)。秒と分はすでに0と59の間の値しか取っていません。 'user792677'のポストからのリンクをチェックしてください。より良い説明ができます(同じアイデアを使用し、新しい値が選択された後に中央にスクロールします)。 –

+0

ああ..同じ値を返すために 'pickerView:didSelectRow:inComponent:'を変更する必要もあります( 'component == 0' '_h'(時)の最初のif - am/pm - を削除します) %24(または行%24 + 1は、 'titleForRow:'メソッドでどのように使用するかによって異なります) –

1

はここで何をしたい行うことが可能な方法の一つですが、私にとってはかなり見ていませんが、動作するはずです: Pauldy’s House of Geek Blog Archive The Abusive PickerView

基本的には、ループをシミュレートするためにロット、ロット、ロットの重複アイテムを作成しています。

関連する問題