2011-10-02 31 views
5

Tôi có một UIPickerview tùy chỉnh và tôi không muốn sử dụng một datepicker. Tôi muốn triển khai tính năng khi người dùng cuộn xuống/tăng giờ, thành phần AM/PM sẽ chuyển trong khi giờ đang di chuyển. Điều này có nghĩa rằng tôi cần phải chuyển đổi nó trước khi pickerView didSelectRow được gọi. Có cách nào để làm việc này không?có phương thức ủy quyền uipickerview như scrollviewDidScroll không?

Cảm ơn

Trả lời

12

Sử dụng phương pháp sau đây,

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

Trên phương pháp là từ UIPickerViewDelegate, Nếu người dùng chọn bất kỳ yếu tố sử dụng pickerview, phương pháp này được tự động kích hoạt.

Hy vọng điều đó sẽ giúp ích cho bạn.

Sửa:

Tôi nghĩ rằng bạn nên sử dụng phương pháp sau đây để phát hiện - trong đó hướng người dùng được di chuyển?

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

bất cứ khi nào người dùng cuộn lên/xuống phương pháp trên được kích hoạt tự động tương tự như UITableView. Hãy nhớ rằng UIPickerView đang sử dụng UIPickerTableView riêng tư, vì vậy chúng tôi không thể phát hiện được cách bạn muốn.

Hãy để tôi giải thích việc phát hiện hướng trong pickerview.

Ví dụ. Các hàng hiển thị là index_4,index_5,index_6,index_7. Bây giờ nếu người dùng cuộn xuống, hãy gọi số index_8. Tương tự, nếu người dùng đang cuộn lên, hãy index_3 sẽ được gọi.

Tôi hy vọng mẹo này sẽ giải quyết được sự cố của bạn. Mặc dù cho tôi biết phản hồi của bạn về điều này.

+0

Tôi đã biết phương pháp này.vấn đề là nó kích hoạt khi bộ chọn đã ngừng di chuyển, tôi cần một cuộc gọi lại trong khi nó vẫn đang cuộn. –

+0

@AndrewPark - Tôi đã cập nhật câu trả lời. –

+0

cảm ơn! tôi không có ý tưởng titleForRow được gọi trong khi nó cuộn. –

3

phải sử dụng hai phương pháp đại biểu này UIPickerView cho sự kiện:

DID END SCROLL:

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

SẼ bắt đầu cuộn:

- (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 trừ việc xây dựng UIPickerview (firstTime !); Vì vậy, bạn phải thực hiện một sự kiện didendscroll giả khi bạn hoàn thành để xây dựng bạn piker hoặc bỏ qua đầu tiên willstart cuộn cho hàng piker có thể nhìn thấy

1

Có một thủ thuật để phát hiện điều này nhưng không có phương pháp đại biểu/tài sản để phát hiện nếu di chuyển của nó hay không

  1. mất một tài sản như isScrolling
  2. bộ isScrolling true trong func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? hoặc tương đương phương pháp
  3. bộ isScrolling true trong func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)

hy vọng điều này sẽ giúp, BTW đây là những gì được giải thích trong tất cả các câu trả lời được đề cập ở trên

Các vấn đề liên quan