UIPickerView заморозить интерфейс - PullRequest
0 голосов
/ 29 марта 2019

В моем приложении у меня есть ViewController с двумя компонентами: UILabel, который будет пользователем, как часы, и UIPickerView, который позволяет пользователю выбирать элемент.

Здесь есть код:

class MyView: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{

@IBOutlet weak var lblClock: UILabel!
@IBOutlet weak var pickerAttendance: UIPickerView!
var timer : Timer!
var dateTime: Date!
var pickerData: [String] = ["a","b","c"]

   override func viewDidLoad() {
        super.viewDidLoad()

        dateTime = Date()
        timer = Timer.scheduledTimer(timeInterval: TimeInterval(1), target: self, selector: #selector(updateDate), userInfo: nil, repeats: true)
        timer.fire()

        pickerAttendance.delegate = self
        pickerAttendance.dataSource = self
   }

    @objc func updateDate(){
        dateTime = NSCalendar.current.date(byAdding: Calendar.Component.second, value: 1, to: self.dateTime)
        let s = DateFormatter.localizedString(from: self.dateTime, dateStyle: DateFormatter.Style.none, timeStyle: DateFormatter.Style.medium)
        DispatchQueue.main.async {
            self.lblClock.text = s
        }
    }

   func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
   }

   func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
   }

   func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return pickerData[row]
   }
}

Я создаю экземпляр Date с фактическим значением и таймером, каждую секунду функция обновляет значение метки.Я объясняю свою проблему: когда я прокручиваю окно выбора, ярлык с таймером не обновляется, но когда я отпускаю прокрутку, ярлык запускается поверх обновления.

Scrool заморозил пользовательский интерфейс.

Я пытался обновить метку в главном потоке, но проблема все еще появляется.Я ожидаю, что когда я прокручиваю вид выбора, ярлык продолжит обновляться.

1 Ответ

1 голос
/ 29 марта 2019

Поместите свой таймер в цикл выполнения:

override func viewDidLoad() {
    super.viewDidLoad()

    dateTime = Date()
    timer = Timer.scheduledTimer(timeInterval: TimeInterval(1), target: self, selector: #selector(updateDate), userInfo: nil, repeats: true)

    RunLoop.main.add(timer, forMode: RunLoop.Mode.common)

    timer.fire()

    pickerAttendance.delegate = self
    pickerAttendance.dataSource = self
}
...