我想使用多重下拉菜单。但这会发生“索引超出范围”错误
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()
会导致错误。
我知道“索引超出范围错误”是什么意思。
但是我不知道为什么这段代码有错误。
有什么东西,我在代码中不见了吗?
答案 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)
}
}