我希望在我的tableView
中检查标记项目,但我找不到任何有关此问题的解决方案。我尝试使用NSArray
但它崩溃并导致'Array out of bounds'
错误导致崩溃,因为当我想在indexPath
删除时它没有该索引并且崩溃所以我决定使用<强烈的>无序集合,例如Dictionary
,但这次它不会完全删除所选indexPath
中的项目。我的TableView
中有我的代码。
let services = ["1", "2", "3"]
var selectedServices = [Int: String]()
var selectedServicesArray = [String]()
@IBOutlet weak var saveButtonOutlet: UIButton!
// MARK: - LifeCycle
override func viewDidLoad() {
super.viewDidLoad()
DesignSettings().clipComponents([saveButtonOutlet])
}
// MARK: - TableView DataSource & Delegate Methods
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return services.count
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let selectedRow = tableView.cellForRowAtIndexPath(indexPath) {
if selectedRow.accessoryType == .None {
selectedRow.accessoryType = .Checkmark
selectedServices[indexPath.row] = selectedRow.textLabel?.text
} else {
selectedRow.accessoryType = .None
selectedServices.removeValueForKey(indexPath.row)
}
}
for (_, value) in selectedServices {
self.selectedServicesArray.append(value)
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier(Constants.CellIdentifier, forIndexPath: indexPath)
cell.textLabel?.text = services[indexPath.row]
return cell
}
还有console
打印;
["1", "1", "2"]
["3"]
["2", "3", "2"]
["2", "1", "1", "2", "3", "1", "2"]
我该如何解决这个问题? 在tableView中获取检查标记项的正确方法是什么? 谢谢!
答案 0 :(得分:1)
首先不明白你为什么需要selectedServicesArray
以及你的问题究竟是什么。你应该总是展示你的3项服务?在您的代码中,您修改了selectedServices
和selectedServicesArray
,但在numberOfRowsInSection
中始终是services.count
- 3.所以这很奇怪。更改选中标记后,您没有更新tableView。所以我提供了一些代码:
let services = ["1", "2", "3"]
var selectedServices = [Int: Bool]()
// MARK: - TableView DataSource & Delegate Methods
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return services.count
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let selectedRow = tableView.cellForRowAtIndexPath(indexPath) {
if selectedRow.accessoryType == .None {
selectedRow.accessoryType = .Checkmark
selectedServices[indexPath.row] = true
} else {
selectedRow.accessoryType = .None
selectedServices[indexPath.row] = false
}
}
tableView.reloadData()
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier(Constants.CellIdentifier, forIndexPath: indexPath)
// check selectedServices[indexPath.row] and update your layout
return cell
}
答案 1 :(得分:1)
有2个问题:
您经常append
- selectedServicesArray
循环中的for
。要解决此问题,您必须删除所有对象,然后添加所有选中的内容。
您正在使用中间对象来处理所选的值,我建议直接在selectedServicesArray
添加/删除项目,如下所示:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let selectedRow = tableView.cellForRowAtIndexPath(indexPath) {
if selectedRow.accessoryType == .None {
selectedRow.accessoryType = .Checkmark
selectedServicesArray.append((selectedRow.textLabel?.text)!)
} else {
selectedRow.accessoryType = .None
let indexToDelete = selectedServicesArray.indexOf((selectedRow.textLabel?.text)!)
selectedServicesArray.removeAtIndex(indexToDelete!)
}
}
}