2014-09-26 4 views
10

현재 UIPickerView를 사용하는 곳에서 Swift를 사용하는 앱을 개발 중입니다. 아래 이미지를 참조하십시오. 현재 사용자가 마지막 데이터로 스크롤했을 때 UIPickerView가 중지되지만 절대로 멈추지 않기를 원합니다. 맨 아래에있을 때 스크롤 만 계속하면 첫 번째 데이터부터 시작할 수 있습니다. 또는 상단에서 위로 스크롤하십시오. 나는 당신이 원할 때 언제든지 위 또는 아래로 드래그 할 수있는 애플 카운트 다운과 같기를 원한다. UIPickerView - 데이터 루프하기

나는이 원하는 방법은 현재

enter image description here

얼마나 :

enter image description here

답변

9

여기 네 단계가 될 것입니다 - 우리는 피커 뷰 데이터를 보유 할 몇 가지 상수를 설정합니다 및 구성을 조금 변경 한 다음 UIPickerViewDataSourceUIPickerViewDelegate 메서드를 추가하고 viewDidLoad 초기화로 끝냅니다.

첫째, 구성 :

private let pickerViewData = Array(0...59)  // contents will be 0, 1, 2, 3...59, change to whatever you want 
private let pickerViewRows = 10_000   // any big number 
private let pickerViewMiddle = ((pickerViewRows/pickerViewData.count)/2) * pickerViewData.count 

참고 pickerViewMiddle 일정 - 매우 쉽게 오프셋 행에서 우리의 현재 가치를 얻을 수 있도록 계산합니다. 데이터 소스에 - 우리가 정말 각 행에 대한 제목을 제공해야하지만, 우리는 배열에서 값에 행 번호를 변환하는 도우미 메서드 추가 할 것입니다 :

extension ViewController : UIPickerViewDataSource { 
    func valueForRow(row: Int) -> Int { 
     // the rows repeat every `pickerViewData.count` items 
     return pickerViewData[row % pickerViewData.count] 
    } 

    func rowForValue(value: Int) -> Int? { 
     if let valueIndex = find(pickerViewData, value) { 
      return pickerViewMiddle + value 
     } 
     return nil 
    } 

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { 
     return "\(valueForRow(row))" 
    } 
} 

을 그리고 마지막으로 우리가 ' 당신의 viewDidLoad 설정 위임 및 데이터 소스에,

extension ViewController : UIPickerViewDelegate { 
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return pickerViewRows 
    } 

    // whenever the picker view comes to rest, we'll jump back to 
    // the row with the current value that is closest to the middle 
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     let newRow = pickerViewMiddle + (row % pickerViewData.count) 
     pickerView.selectRow(newRow, inComponent: 0, animated: false) 
     println("Resetting row to \(newRow)") 
    } 

} 

초기화하려면 다음 선택기의 중간에 올바른 행으로 이동 : LL 대리자를 설정

self.picker.delegate = self 
self.picker.dataSource = self 
let initialValue = 0 
if let row = rowForValue(initialValue) { 
    self.picker.selectRow(row, inComponent: 0, animated: false) 
} 
// or if you just want to start in the middle: 
// self.picker.selectRow(pickerViewMiddle, inComponent: 0, animated: false) 
+0

감사합니다! 그것은 완벽하게 작동합니다! – ThomasGulli

+1

[이 답변] (http://stackoverflow.com/a/367436/172218)에서 언급했듯이 피커의 행 수를 "임의의 큰 수"로 설정하면 VoiceOver가 엉망이되어 [큰 숫자 ] ", 접근성 문제입니다. 이 주변의 어떤 방법? –

+0

안녕하세요, 네이트! 구성을 어디에 선언합니까? 나는 내 수업에서 그것을 선언했지만 내 수업에서 인스턴스를 사용할 수 없다는 오류를 제공합니다. –

2

이 이미 답이 여기있다 : How do you make an UIPickerView component wrap around?

기본 아이디어는 사용자가 결코 끝까지 도달하지 못할 정도로 반복되는 행 수가 충분히 많은 선택기보기를 만드는 것입니다. 위의 대답에는 행 수가 어떻게 생성되는지에 대한 문제가 있으므로 해당 부분을 편집하고 아래의 나머지 대답을 제공했습니다. 당신이 당신의 목적을 위해 신속한로 변환해야합니다, 그래서 이것은 ... 목표 - C이다

@implementation ViewController 
NSInteger numberItems; 
NSInteger currentValue; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.pickerView.delegate = self; 
    numberItems = 60; 
    currentValue = 0; 
    [self.pickerView selectRow:(currentValue + (numberItems * 50)) inComponent:0 animated:NO]; 
    [self.view addSubview:self.pickerView]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    //return NSIntegerMax; -- this does not work on 64-bit CPUs, pick an arbitrary value that the user will realistically never scroll to like this... 
    return numberItems * 100; 
} 

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    return [NSString stringWithFormat:@"%ld", row % numberItems]; 
} 

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    NSInteger rowValueSelected = row % numberItems; 
    NSLog(@"row value selected: %ld", (long)rowValueSelected); 
} 

@end