Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何根据另一个组件中的选定值更改UIPickerView组件中的行数_Swift_Xcode_Uipickerview - Fatal编程技术网

Swift 如何根据另一个组件中的选定值更改UIPickerView组件中的行数

Swift 如何根据另一个组件中的选定值更改UIPickerView组件中的行数,swift,xcode,uipickerview,Swift,Xcode,Uipickerview,谷歌日历应用程序有一个功能,当你想在活动前发送通知时,你可以自定义该功能。如果您不熟悉它,它看起来是这样的: 它本质上是一个具有两个组件的选择器视图,第一个显示用户可以选择的数字,第二个显示时间单位分钟、小时、天、周。当用户选择时间单位时,数字会发生变化。例如,如果用户选择分钟作为单位,则第一个组件将显示数字1到60。如果他们选择小时,第一个组件将显示1到24。选择天将显示1到28,周将显示1到4 我想开发一个类似的特性,但当我运行代码时,错误索引超出了范围。错误发生在这段代码的最后一个函数中。

谷歌日历应用程序有一个功能,当你想在活动前发送通知时,你可以自定义该功能。如果您不熟悉它,它看起来是这样的:

它本质上是一个具有两个组件的选择器视图,第一个显示用户可以选择的数字,第二个显示时间单位分钟、小时、天、周。当用户选择时间单位时,数字会发生变化。例如,如果用户选择分钟作为单位,则第一个组件将显示数字1到60。如果他们选择小时,第一个组件将显示1到24。选择天将显示1到28,周将显示1到4

我想开发一个类似的特性,但当我运行代码时,错误索引超出了范围。错误发生在这段代码的最后一个函数中。在调试部分,行的值为0。我认为错误与数组大小的差异有关,但我不确定。感谢您的帮助

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