首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIPickerView freeze UI

UIPickerView freeze UI
EN

Stack Overflow用户
提问于 2019-03-29 18:13:59
回答 1查看 147关注 0票数 0

在我的应用程序中,我有一个包含两个组件的ViewController :一个像时钟一样供用户使用的UILabel和一个允许用户选择项目的UIPickerView。

下面是代码:

代码语言:javascript
复制
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]
   }
}

我用实际值实例化了一个日期和一个计时器,函数每秒钟更新一次标签的值。我解释了我的问题:当我滚动选择器视图时,带有计时器的标签没有更新,但当我松开滚动条时,标签开始更新。

scrool冻结用户界面。

我已经尝试在主线程中更新标签,但仍然出现问题。我希望当我分析选取器视图时,标签将继续更新。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-29 18:30:54

把你的计时器放在run循环中:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55415090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档