Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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
Arrays 更改组件0时,重置UIPickerView的第一个组件的值_Arrays_Swift_Uipickerview - Fatal编程技术网

Arrays 更改组件0时,重置UIPickerView的第一个组件的值

Arrays 更改组件0时,重置UIPickerView的第一个组件的值,arrays,swift,uipickerview,Arrays,Swift,Uipickerview,当组件0发生更改时(为了避免因IndexAutofrange而可能出现的错误),我不知道如何将PickerView的第一个组件中使用的数组重置为组件0 这是我的数据结构 let bananas = ["banana1", "banana2"] let fruitArray = ["banana1" : ["cherry1","cherry2"], "banana2" : ["cherry1", "cherry2", "cherry3"]] func numberOfComponents(in

当组件0发生更改时(为了避免因IndexAutofrange而可能出现的错误),我不知道如何将PickerView的第一个组件中使用的数组重置为组件0

这是我的数据结构

let bananas = ["banana1", "banana2"]
let fruitArray = ["banana1" : ["cherry1","cherry2"], "banana2" : ["cherry1", "cherry2", "cherry3"]]


func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 2
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if component == 0 {
        return bananas.count
    }
    else {
        let selectedBanana = pickerView.selectedRow(inComponent: 0)
        return fruitArray[banana[selectedBanana]]!.count
    }
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {


    let selectedBanana = pickerView.selectedRow(inComponent: 0)
    let selectedCherry = pickerView.selectedRow(inComponent: 1)


    bananaPicked = bananas[selectedBanana]
    cherryPicked = fruitArray[bananaPicked]![selectedCherry]


    pickerView.reloadAllComponents() 
    }


func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
    return bananas[row]
}
else {
    let selectedBanana = pickerView.selectedRow(inComponent: 0)
    return fruitArray[selectedBanana]![row]
}
}
现在,当我(比方说)在banana2和cherry3中,但我切换到banana1时,我得到一个IndexOutfrange错误,因为第一个香蕉数组当然没有第三个项。我的愿望是,每当香蕉行被更改为樱桃行重置为0时,它都会被激活

__________更新______________ 这是我发现的另一个导致崩溃的错误(indexOutOfRange),我发布了一个屏幕截图


更改组件0时,将组件1中的选定行设置为0

此外,无需重新加载所有组件。只有组件1需要重新加载

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if component == 0 {
        pickerView.selectRow(0, inComponent: 1, animated: false)
    }

    let selectedBanana = pickerView.selectedRow(inComponent: 0)
    let selectedCherry = pickerView.selectedRow(inComponent: 1)

    bananaPicked = bananas[selectedBanana]
    cherryPicked = fruitArray[bananaPicked]![selectedCherry]

    //pickerView.reloadAllComponents()
    pickerView.reloadComponent(1)
}
对于第二次崩溃,请尝试一些防御编程以避免崩溃:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if component == 0 {
        return bananas[row]
    }
    else {
        let selectedBanana = pickerView.selectedRow(inComponent: 0)
        let rowData = fruitArray[bananas[selectedBanana]]!
        if rowData.indices.contains(row) {
            return rowData[row]
        } else {
            return nil
        }
    }
}

更改组件0时,将组件1中的选定行设置为0

此外,无需重新加载所有组件。只有组件1需要重新加载

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if component == 0 {
        pickerView.selectRow(0, inComponent: 1, animated: false)
    }

    let selectedBanana = pickerView.selectedRow(inComponent: 0)
    let selectedCherry = pickerView.selectedRow(inComponent: 1)

    bananaPicked = bananas[selectedBanana]
    cherryPicked = fruitArray[bananaPicked]![selectedCherry]

    //pickerView.reloadAllComponents()
    pickerView.reloadComponent(1)
}
对于第二次崩溃,请尝试一些防御编程以避免崩溃:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if component == 0 {
        return bananas[row]
    }
    else {
        let selectedBanana = pickerView.selectedRow(inComponent: 0)
        let rowData = fruitArray[bananas[selectedBanana]]!
        if rowData.indices.contains(row) {
            return rowData[row]
        } else {
            return nil
        }
    }
}

pickerView.selectedRow(不完整:0)
返回整数值。但是你的
fruitArray
是一个导致错误的字典吗?@AhmetSinaUstem后面的行我应该用这个Int来访问列表中某个精确位置的项目(作为字典中的值,使用香蕉键)@rmaddy导致错误的行是cherrypeck=fruitArray[bananaPicked]![selectedCherry],然后重新加载所有组件()。错误是索引超出范围
pickerView。selectedRow(不完整:0)
返回Int值。但是你的
fruitArray
是一个导致错误的字典吗?@AhmetSinaUstem后面的行我应该用这个Int来访问列表中某个精确位置的项目(作为字典中的值,使用香蕉键)@rmaddy导致错误的行是cherrypeck=fruitArray[bananaPicked]![selectedCherry],然后重新加载所有组件()。错误是索引超出范围谢谢。这就解决了问题。然而,当我正在测试这个应用程序时,我遇到了另一个问题,导致它崩溃。我刚刚尝试随机滚动选择器的组件0,同时滚动组件1。它突然坠毁了。除了将屏幕上可能的触摸限制在一次之外,你认为还有其他方法可以解决这个问题吗?谢谢,这是一个超出行返回水果数组[selectedBanana]范围的索引![世界其他地区]标题栏内。我观察到,当组件0在第一行上方选择时发生了这种情况,组件1向下滚动。这是因为组件0的索引是-1吗?我刚刚检查了该值,当(在本例中是等效的)在下面这一行中选择了edbanana=0和row=2时发生了这种情况:return-fructarray[selectedBanana]![世界其他地区]。可能仍然是因为与以前相同的错误,但如果我同时执行此操作太快,则没有时间重置为0。请参阅更新的答案以获取第二次崩溃的解决方案。谢谢。这就解决了问题。然而,当我正在测试这个应用程序时,我遇到了另一个问题,导致它崩溃。我刚刚尝试随机滚动选择器的组件0,同时滚动组件1。它突然坠毁了。除了将屏幕上可能的触摸限制在一次之外,你认为还有其他方法可以解决这个问题吗?谢谢,这是一个超出行返回水果数组[selectedBanana]范围的索引![世界其他地区]标题栏内。我观察到,当组件0在第一行上方选择时发生了这种情况,组件1向下滚动。这是因为组件0的索引是-1吗?我刚刚检查了该值,当(在本例中是等效的)在下面这一行中选择了edbanana=0和row=2时发生了这种情况:return-fructarray[selectedBanana]![世界其他地区]。可能仍然是由于与以前相同的错误,但如果我同时执行此操作太快,则没有时间重置为0。有关第二次崩溃的解决方案,请参阅更新的答案。