ios - 当我在明确选择一行之前选择 UIPickerView 上的“完成”按钮时,应用程序崩溃
问题描述
除非我明确选择一行,否则 UIPickerView 会崩溃并出现错误
*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“时间间隔必须大于 0”
我知道它崩溃是因为它没有选择任何一行,并且时间间隔的默认值为 0。
那么我怎样才能PickerView
选择第一行而不必自己明确选择呢?
以下是相关代码:
var timerDisplayed = 0
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
timerDisplayed = Int(timeSelect[row])!
}
@objc func timeClock(){
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { (didAllow, error) in }
let content = UNMutableNotificationContent()
content.title = "Time is up!"
content.badge = 1
content.sound = UNNotificationSound.init(named: UNNotificationSoundName(rawValue: "note1.wav"))
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval(timerDisplayed), repeats: false)
let request = UNNotificationRequest(identifier: "timerDone", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
self.timerTextField.text = (" \(String(self.timerDisplayed))")
dismissKeyboard()
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.Action), userInfo: nil, repeats: true)
}
}
@objc func Action(){
if timerDisplayed != 0 {
DispatchQueue.main.async {
self.timerDisplayed -= 1
self.timerTextField.text = (" \(String(self.timerDisplayed))")
}
}
else {
self.timer.invalidate()
self.timerTextField.text = nil
self.timerTextField.placeholder = " Timer"
}
}
解决方案
也许您可以使用您的timeClock()
方法,将其放在第一行:
let timerDisplayed = self.timerDisplayed > 0 ? timerDisplayed : Int(timeSelect[0])!
所以它可能看起来像这样:
@objc func timeClock(){
let timerDisplayed = self.timerDisplayed > 0 ? timerDisplayed : Int(timeSelect[0])!
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { (didAllow, error) in }
let content = UNMutableNotificationContent()
content.title = "Time is up!"
content.badge = 1
content.sound = UNNotificationSound.init(named: UNNotificationSoundName(rawValue: "note1.wav"))
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval(timerDisplayed), repeats: false)
let request = UNNotificationRequest(identifier: "timerDone", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
self.timerTextField.text = (" \(String(self.timerDisplayed))")
dismissKeyboard()
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.Action), userInfo: nil, repeats: true)
}
}
或者您可以将其放入viewDidLoad
以自动选择第一行:
let defaultFirstRow = pickerView.selectedRow(inComponent: 0);
pickerView(pickerView, didSelectRow: defaultFirstRow, inComponent:0)
推荐阅读
- javascript - return view() 不加载 css 和 js
- c# - Roslyn 分析器不尊重 .editorconfig
- python - PyPi 拒绝版本值
- c++ - 在 `ifstream::getline` 中禁用 Ctrl-Z 行为
- html - 我如何更改两个项目而只将鼠标悬停在一个上
- vue.js - Nuxt:如何显式命名 JS 块?
- c - 使用二分查找查找已排序字符串中的第一个大写字母
- arrays - 尝试在 hlsl 中分配值时我做错了什么?
- javascript - 为 read-more-react npm 包创建 index.d.ts
- ansible - Ansible 处理程序不起作用,除非我包括:它们在我的游戏中?