UIPickerView 冻结UI
UIPickerView freeze UI
在我的应用程序中,我有一个包含两个组件的 ViewController:一个 UILabel,用户可以像时钟一样使用;UIPickerView 允许用户 select 一个项目。
这里有代码:
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]
}
}
我实例化了一个具有实际值的日期和一个计时器,该函数每隔一秒更新一次标签的值。
我解释我的问题:
当我滚动 pickerview 时,带有计时器的标签不会更新,但是当我释放滚动时,标签会重新开始更新。
滚动条冻结 ui。
我已经尝试更新主线程中的标签,但问题仍然存在。
我希望当我滚动选择器视图时,标签将继续更新。
将您的计时器置于 运行 循环中:
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
}
在我的应用程序中,我有一个包含两个组件的 ViewController:一个 UILabel,用户可以像时钟一样使用;UIPickerView 允许用户 select 一个项目。
这里有代码:
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]
}
}
我实例化了一个具有实际值的日期和一个计时器,该函数每隔一秒更新一次标签的值。 我解释我的问题: 当我滚动 pickerview 时,带有计时器的标签不会更新,但是当我释放滚动时,标签会重新开始更新。
滚动条冻结 ui。
我已经尝试更新主线程中的标签,但问题仍然存在。 我希望当我滚动选择器视图时,标签将继续更新。
将您的计时器置于 运行 循环中:
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
}