我想使用多重下拉菜单

时间:2018-10-11 06:40:39

标签: arrays swift

我想使用多重下拉菜单。但这会发生“索引超出范围”错误

var drop: Array<DropDown?> = []
var dropDataSource: Array<String> = []
@IBOutlet var buttons: [UIButton]!

我这样宣布。

func setDropDown() {

    for i in 0...15 {
        drop[i] = DropDown()
        drop[i]?.anchorView = button
        drop[i]?.bottomOffset = CGPoint(x: 0, y:(dropDown?.anchorView?.plainView.bounds.height)!)
        switchDropData(dataCount: i)
        drop[i]?.dataSource = dropDataSource
        buttons[i].addTarget(self, action: #selector(dropBtn), for: .touchUpInside)
        drop[i]?.selectionAction = { [unowned self] (index: Int, item: String) in
            self.buttons[i].setTitle(item, for: .normal)
        }

    }

}

@objc func dropBtn(dataCount: Int) {
    drop[dataCount]?.show()
}

并进行15个下拉菜单。

但是drop[I] = DropDown()会导致错误。

我知道“索引超出范围错误”是什么意思。

但是我不知道为什么这段代码有错误。

有什么东西,我在代码中不见了吗?

2 个答案:

答案 0 :(得分:1)

Index out of range意味着您正在尝试访问一个不存在的数组中的元素,因为索引不在数组的范围内(从第一个到最后一个)。

您的数组似乎没有被填充。
您应该更改以下内容以防止错误:

for i in 0...15 {

...至:

for d in drop {

这将有效遍历数组中的所有元素。如果数组中有0个元素,则循环根本不会结束,因此不会出现index out of bounds错误。


如果要创建下拉列表,而不是不访问它们,则需要初始化一个新变量,然后将新的下拉列表附加到数组中:

for _ in 0...15 {
    var dropdown = DropDown()
    drop.append(dropdown)
    dropdown.anchorView = button
    // ...
}

答案 1 :(得分:0)

只需创建一个新的DropDown(),然后将其附加到放置数组中即可

func setDropDown() {

 for i in 0...15 {
    var newDrop = DropDown()
    newDrop.anchorView = button
    newDrop.bottomOffset = CGPoint(x: 0, y:(dropDown.anchorView?.plainView.bounds.height)!)
    switchDropData(dataCount: i)
    newDrop.dataSource = dropDataSource
    buttons[i].addTarget(self, action: #selector(dropBtn), for: .touchUpInside)
    newDrop.selectionAction = { [unowned self] (index: Int, item: String) in
        self.buttons[i].setTitle(item, for: .normal)
    }
    drop.append(newDrop)
 }

}