Swift 如何根据另一个组件中的选定值更改UIPickerView组件中的行数
谷歌日历应用程序有一个功能,当你想在活动前发送通知时,你可以自定义该功能。如果您不熟悉它,它看起来是这样的: 它本质上是一个具有两个组件的选择器视图,第一个显示用户可以选择的数字,第二个显示时间单位分钟、小时、天、周。当用户选择时间单位时,数字会发生变化。例如,如果用户选择分钟作为单位,则第一个组件将显示数字1到60。如果他们选择小时,第一个组件将显示1到24。选择天将显示1到28,周将显示1到4 我想开发一个类似的特性,但当我运行代码时,错误索引超出了范围。错误发生在这段代码的最后一个函数中。在调试部分,行的值为0。我认为错误与数组大小的差异有关,但我不确定。感谢您的帮助Swift 如何根据另一个组件中的选定值更改UIPickerView组件中的行数,swift,xcode,uipickerview,Swift,Xcode,Uipickerview,谷歌日历应用程序有一个功能,当你想在活动前发送通知时,你可以自定义该功能。如果您不熟悉它,它看起来是这样的: 它本质上是一个具有两个组件的选择器视图,第一个显示用户可以选择的数字,第二个显示时间单位分钟、小时、天、周。当用户选择时间单位时,数字会发生变化。例如,如果用户选择分钟作为单位,则第一个组件将显示数字1到60。如果他们选择小时,第一个组件将显示1到24。选择天将显示1到28,周将显示1到4 我想开发一个类似的特性,但当我运行代码时,错误索引超出了范围。错误发生在这段代码的最后一个函数中。
import UIKit
class AlarmSet
{
func timeIntervals() -> [String]
{
return ["minutes", "hours", "days", "weeks"]
}
func timeValues(time: String) -> [Int]
{
switch time
{
case "minutes":
return Array(1...60)
case "hours":
return Array(1...24)
case "days":
return Array(1...28)
case "weeks":
return [1, 2, 3, 4]
default:
return [0]
}
}
}
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate
{
@IBOutlet weak var addAlarm: UIButton!
@IBOutlet weak var alarmView: UIPickerView!
//The first component of the picker displays numbers
var picker1Options:[Int] = []
//The second picker displays units of time (minutes, hours, etc.)
var picker2Options:[String] = []
override func viewDidLoad()
{
super.viewDidLoad()
alarmView.delegate = self
alarmView.dataSource = self
alarmView.delegate?.pickerView?(alarmView, didSelectRow: 0, inComponent: 0)
alarmView.delegate?.pickerView?(alarmView, didSelectRow: 0, inComponent: 1)
alarmView.isHidden = true
let alarm = AlarmSet();
picker2Options = alarm.timeIntervals()
let firstValue = picker2Options[0]
picker1Options = alarm.timeValues(time: firstValue)
// Do any additional setup after loading the view.
}
func numberOfComponents(in pickerView: UIPickerView) -> Int
{
return 2
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
if component == 1
{
return picker2Options.count
}
else
{
return picker1Options.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
if component == 0
{
return "\(picker1Options[row])"
}
else
{
return "\(picker2Options[row])"
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
if component == 1
{
let alarm = AlarmSet();
//Out of range error is on this next line
let currentValue = picker2Options[row]
picker1Options = alarm.timeValues(time: currentValue)
pickerView.reloadAllComponents()
}
}
}
你在打电话吗
alarmView.delegate?.pickerView?(alarmView, didSelectRow: 0, inComponent: 1
在您的视图中,在设置picker2Options变量之前加载,因此当picker2Options为空时,它将尝试访问picker2Options[0]。在调用委托方法之前设置数组通常,在尝试访问它之前,最好先检查array.index.containsyourIndex