2014-09-26 16 views
10

Şu anda bir UIPickerView kullandığım Swift'i kullanarak bir uygulama geliştiriyorum, aşağıdaki resme bakın. Şu anda kullanıcı son verilere kaydırdığında UIPickerView durur, ama asla durmasını istemiyorum. İlk veriden başlamanın en altta olduğunuzda ilerlemeye devam etmesini istiyorum. Veya yukarıdayken yukarı kaydırın. Apple'ın istediğin zaman yukarı veya aşağı sürükleyebileceğin Geri sayım gibi olmasını istiyorum. UIPickerView - Verileri döngü

Ben bunu istiyorum nasıl şu anda

enter image description here

Nasıl:

enter image description here

cevap

9

burada dört adım olacak - biz seçici görünümü verileri tutmak için bazı sabitleri kurmak vereceğiz ve Yapılandırma biti, daha sonra UIPickerViewDataSource ve UIPickerViewDelegate yöntemlerini ekleyeceğiz ve viewDidLoad başlatmasıyla biteceğiz.

Birincisi, yapılandırma:

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 

Not pickerViewMiddle sabit - çok kolay ofset satırdan mevcut değeri elde etmek yapmaya hesaplanır. Veri kaynağına Açık - biz gerçekten sadece her satır için bir başlık gerekiyor, ama biz diziden bir değere bir satır numarasını dönüştürmek için bir yardımcı yöntem ekleyeceğiz:

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))" 
    } 
} 

Ve nihayet' senin viewDidLoad set temsilci ve veri kaynağında,

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)") 
    } 

} 

başlatmak için ve sonra seçicinizde ortasında satıra doğru hareket: ll temsilci kurmak

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

Teşekkür! Mükemmel çalışıyor! – ThomasGulli

+1

[Bu yanıt] 'da (http://stackoverflow.com/a/367436/172218) belirtildiği gibi, seçicideki satır sayısını "herhangi bir büyük sayı" olarak ayarlayan VoiceOver, "[item] [büyük sayı] değerini verir ] ", bir erişilebilirlik sorunudur. Bunun herhangi bir yolu var mı? –

+0

Merhaba Nate! Yapılandırmanızı nerede bildiriyorsunuz? Bunu sınıfımda beyan ettim, ancak bana örnekle bir hata ver, sınıfımda kullanılamaz. –

2

Bu zaten burada yanıtlandı: How do you make an UIPickerView component wrap around?

Temel fikir, kullanıcının büyük olasılıkla hiç bitmeyecek kadar büyük sayıda yinelenen satır içeren bir seçici görünüm oluşturmasıdır. Yukarıdaki cevapta, satır sayısının nasıl oluşturulduğu ile ilgili bir sorun var, bu yüzden bu parçayı düzenledim ve kalan cevabı aşağıda sağladım. Eğer amaçlarla Swift dönüştürmek gerekir böylece bu ... nesnel-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