我目前正在开发一个程序,其中每行都有一个带有分段控件的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) {
}
}
答案 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从表中获取单元格,然后将标签和分段控件添加到其中。当表格滚动时,单元格将开始重复使用,您将获得一个已经添加了标签和分段控件的单元格,然后您将添加另一个标签和分段控件。这将一直持续到每个单元格上都有大量标签和段控件。您需要避免这样做,否则最终您的应用可能会崩溃。