2011-10-02 13 views
5

Tengo un UIPickerview personalizado y no quiero usar un datepicker. Quiero implementar la función donde cuando un usuario se desplaza hacia abajo o hacia arriba en las horas, el componente AM/PM cambia mientras la hora se desplaza. Esto significa que necesito cambiarlo antes de que se llame pickerView didSelectRow. ¿Hay alguna forma de hacer esto?¿hay un método delegado uipickerview como scrollviewDidScroll?

Gracias

Respuesta

12

Uso siguiente método,

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    // put your logic here. 
} 

método anterior es de UIPickerViewDelegate, Si el usuario selecciona cualquier elemento utilizando pickerview, este método se activa automáticamente.

Espero que te ayude.

Editar:

creo que debería utilizar siguiente método para detectar - en la que el usuario es la dirección de desplazamiento?

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    NSLog(@"scrolling to row is %@",[NSString stringWithFormat:@"index_%i",row]); 
    return [NSString stringWithFormat:@"index_%i",row]; 
} 

cada vez que el usuario se desplaza hacia arriba/abajo por encima de método se activa automáticamente que es similar a UITableView. Recuerde UIPickerView está utilizando UIPickerTableView que es privado, por lo que no podemos detectar el desplazamiento de la manera que desee tener.

Déjenme explicar la detección de la dirección en pickerview.

Ejemplo. Las filas visibles son index_4,index_5,index_6,index_7. Ahora, si el usuario se desplaza hacia abajo index_8 se llamará. De manera similar, si el usuario está desplazándose hacia arriba, se llamará al index_3.

Espero que este truco resuelva su problema. Aunque, déjame saber tu opinión sobre esto.

+0

Ya conozco este método.el problema es que se dispara cuando el selector ha dejado de desplazarse, necesito una devolución de llamada mientras todavía está desplazándose. –

+0

@AndrewPark - He actualizado la respuesta. –

+0

gracias! No tenía idea de que se llamara titleForRow mientras se desplazaba. –

3

tienen que utilizar este método delegado UIPickerView dos para eventos:

puso fin DESPLAZAMIENTO:

- (void)pickerView:(UIPickerView *)pV didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    NSLog(@"pickerView didSelectRow %zd",row); 
    // DID END SCROLL: CALL YOUR HEANDLER METHOD!! 
} 

empezará a desplazarse:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{ 
    // WILL START SCROLLING: CALL YOUR HEANDLER METHOD!! 
    UILabel* label = (UILabel*)view; 
    if (!label){ 
     label = [UILabel new]; 
     [label setFrame:frame]; 
     [label setBackgroundColor:[UIColor clearColor]]; 
     [label setFont:[UIFont fontWithName:FONT_QUICKSAND_BOLD size:12]]; 
     [label setTextAlignment:NSTextAlignmentRight]; 
     [label setLineBreakMode:NSLineBreakByTruncatingMiddle]; 
     [label setTextColor:UIColorFromRGB(0X2692ff)]; 
     } 
    //Update labeltext here 
    [label setText:[NSString stringWithFormat:@"row %zd",row]]; 
    return label; 
} 

Obviosly a excepción de la construcción de UIPickerView (firstTime !); así que tiene que implementar un evento de desplazamiento falso cuando termine de construir su puntero o ignore el primer desplazamiento de inicio para la fila de apuntador visible

1

Hay un truco para detectar esto pero no hay un método/propiedad de delegado para detectar si se está desplazando o no

  1. tomar una propiedad como isScrolling
  2. conjunto isScrolling en true en func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? o equivalente método
  3. conjunto isScrolling en true en func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)

espero que esto ayude, por cierto esto es lo que se explica en todas las respuestas mencionadas

Cuestiones relacionadas