创建一个数组以在单元格索引

时间:2017-06-06 16:20:59

标签: ios swift logic

我目前正在开发一个程序,其中每行都有一个带有分段控件的TableView。我已经将标签附加到每个分段控件上,该控件对应于分段控件所在的行(即,分段控件1对应于行1等)。此外,分段控件有自己的索引(选项0对应索引0,选项1对应索引1)

我想有一个数组,它将分段控制索引的值存储在与分段控件标记相对应的位置。即如果第一行的分段控制索引为1,则第二行的分段控制索引为0,第三行的分段控制索引为1,该数组应输出: [1,0,1]

我最好的想法是创建一个数组,将数组的索引指定为分段控件的标记,然后将该索引处的值指定为分段控件索引的值(抱歉,我知道它的混乱)。

我确定这是以前有人曾经遇到的编程问题,但是我找不到任何关于它的信息。我在swift编程,但由于这是一个逻辑问题而不是编程问题,我愿意接受任何其他语言的解决方案。

谢谢, 尼克

P.S。 这是到目前为止应用程序的图片和我正在使用的代码供您参考。

https://i.stack.imgur.com/ezMUJ.png

导入UIKit

class MyTableViewController:UITableViewController {

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 150
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    return 10
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)


    let nameLabel: UILabel = {
        let label = UILabel()
        label.text = "Sample Item"
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    let actionButton = YSSegmentedControl(
        frame: CGRect.zero,
        titles: [
            "Yes",
            "No"
        ])


actionButton.delegate = self
cell.addSubview(nameLabel)
cell.addSubview(actionButton)
actionButton.translatesAutoresizingMaskIntoConstraints = false

cell.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[v0]-160-[v1]-16-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel, "v1": actionButton]));
cell.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel]))
cell.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-60-[v0]-60-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": actionButton]))

actionButton.tag = indexPath.row


    cell.backgroundColor = .green
    return cell

}

override func viewDidLoad() {
    super.viewDidLoad()



    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellId")

    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

extension MyTableViewController: YSSegmentedControlDelegate {
func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt    index: Int) {
    print("\(segmentedControl.tag)" + "\(index)")

}

func segmentedControl(_ segmentedControl: YSSegmentedControl, didPressItemAt index: Int) {

}

}

2 个答案:

答案 0 :(得分:0)

为什么不使用字典而不是数组?这样你就可以存储并轻松地从它的标签中查找段控件的索引,反之亦然:

// Storing index and corresponding tag
var indexToTag = [Int:Int]()
indexToTag[index] = tag

// Looking up tag
let tag = indexToTag[index]

你也可以这样做:

// Storing tag and corresponding index
var tagToIndex = [Int:Int]()
tagToIndex[tag] = index

// Looking up tag
let index = tagToIndex[tag]

我不确定你想要实现的目标,但你甚至可以存储一组UISegmentedControls,以便你可以通过indexRow.path引用它们并获得你想要的任何信息:

var mySegments = [UISegmentedControls]()

你甚至可以在词典中使用它们

var tagToSegment = [Int:UISegmentedControls]()

答案 1 :(得分:0)

只要数组中的项目数与单元格数相匹配,使用类似的数组就可以工作。因此,在表视图控制器中,您有一个填充了初始值的数组。像这样:

var dataArray: [Int] = [1,0,1,1,1,1,0]

然后,您可以使用该数组来确定所需的行数,以便它们始终匹配:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    return dataArray.count
}

基本思想是将数据表示与UI分开。

在相关说明中,为了帮助您,您在创建单元格时遇到问题。您使用dequeueReusableCell从表中获取单元格,然后将标签和分段控件添加到其中。当表格滚动时,单元格将开始重复使用,您将获得一个已经添加了标签和分段控件的单元格,然后您将添加另一个标签和分段控件。这将一直持续到每个单元格上都有大量标签和段控件。您需要避免这样做,否则最终您的应用可能会崩溃。