ios - UIPickerView 冻结 UI
问题描述
在我的应用程序中,我有一个包含两个组件的 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 和一个计时器,该函数每秒钟都会更新标签的值。我解释了我的问题:当我滚动选择器视图时,带有计时器的标签没有更新,但是当我释放滚动时,标签从更新开始。
scool 冻结了 ui。
我试图更新主线程中的标签,但问题仍然出现。我希望当我 scoll 选择器视图标签将继续更新。
解决方案
将您的计时器放入运行循环:
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
}
推荐阅读
- django - Django 未将自定义用户保存为另一个模型中的外键:NOT NULL 约束失败
- c++ - 如何仅从文本文件中读取第一个值
- linux - tcpreplay 乱序发送数据包?
- php - 具有意外结果的 Orderby 函数
- angular - 使用 AngularDart5 获取当前路由名称/url
- sockets - 每当您想发送影响性能的请求时打开 TCP 套接字有多少?
- linux - 无论引擎是打开还是关闭,在 ovirt 上恢复都失败 - 如何解决
- python - 在python中的两个后续迭代器中拆分一个迭代器
- node.js - Visual Studio 2019 进程未关闭,NodeJS 问题
- xamarin.forms - 如何确定 Xamarin Forms 应用程序是否从 FirebaseMessagingServie 的 OnMessageRecieved 运行?