如何在 Swift 2.0 中的 TableView 中获取选中标记的项目
Posted
技术标签:
【中文标题】如何在 Swift 2.0 中的 TableView 中获取选中标记的项目【英文标题】:How to get checkmarked items in TableView in Swift 2.0 【发布时间】:2015-11-30 10:01:22 【问题描述】:我想在我的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 中检查标记项目的正确方法是什么? 谢谢!
【问题讨论】:
【参考方案1】:有两个问题:
你在for
循环中不断地append
-ing 到selectedServicesArray
。要解决此问题,您必须删除所有对象,然后添加所有选定对象。
您正在使用中间对象来处理选定的值,我建议直接向 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!)
【讨论】:
让 indexToDelete = selectedServicesArray.indexOf((selectedRow.textLabel?.text)!) selectedServicesArray.removeAtIndex(indexToDelete!) 是诀窍谢谢。它现在完美运行。如何在我的 tableView 中勾选 selectedServices 项? 没问题,但我没完全明白你的问题,你想在选定的单元格上添加复选标记吗? 我会将这些数据存储到 Parse,当我从 Parse 获取这些数据时,有时我想在我的 tableView 中显示存储的服务(selectedServices)并带有复选标记。 将此添加到您的cellForRowAtIndexPath
if selectedServicesArray.contains((selectedRow.textLabel?.text)!)
selectedRow.accessoryType = .Checkmark
else
selectedRow.accessoryType = .None
它有效,谢谢。当我想在 tableView 中选中另一个项目时,它会删除我的数组中的其他选中标记项目并仅添加新的选定项目。例如:我选中标记并将“1”和“2”添加到我的 selectedServicesArray 它显示带有复选标记的项目。当我选中标记为“3”时,它显示了 3 个已检查的项目,但它仅将最后一个项目添加到我的 selectedServicesArray 中,它会删除最后 2 个项目的任何解决方案?【参考方案2】:
首先不明白你为什么需要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
【讨论】:
Parse.com 需要 NSArray 来存储这些数据,所以我添加了 selectedServicesArray 并希望将 selectedServices 附加到这个数组中,以便我可以将这个数组存储到 Parse.com。以上是关于如何在 Swift 2.0 中的 TableView 中获取选中标记的项目的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 2.0 中的 TableView 中获取选中标记的项目