【问题标题】:UIPickerView freeze UIUIPickerView 冻结 UI
【发布时间】:2019-03-29 10:13:59
【问题描述】:

在我的应用程序中,我有一个 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 和一个计时器,该函数每秒钟都会更新标签的值。 我解释我的问题: 当我滚动pickerview时,带有计时器的标签没有更新,但是当我释放滚动时,标签从更新开始。

scrool 冻结 ui。

我尝试在主线程中更新标签,但问题仍然出现。 我希望当我 scoll 选择器视图时,标签会继续更新。

【问题讨论】:

    标签: ios swift uipickerview


    【解决方案1】:

    将你的计时器放入运行循环中:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2015-01-16
      • 2019-09-16
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多