使用导航按钮从 UITableView 中的选中元素返回数据
Posted
技术标签:
【中文标题】使用导航按钮从 UITableView 中的选中元素返回数据【英文标题】:Return data from checked elements in UITableView using Navigation button 【发布时间】:2021-05-13 16:48:20 【问题描述】:我有一个 UITableView,上面显示了一些元素。
如果用户单击任何元素,则可以检查文本字段上的元素。
我有这方面的代码,而且效果很好。
class MyTableViewController: UITableViewController
let foods = ["tomato", "cheese", "bread", "apple"]
let cellReuseIdentifier = "cell"
@IBOutlet weak var myTableView:UITableView!
override func viewDidLoad()
super.viewDidLoad()
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "DONE", style: .done, target: self, action: #selector(self.avancar(sender:)))
@objc func avancar(sender: UIBarButtonItem)
print("DONE button clicked")
print("myTableView.numberOfSections: \(myTableView.numberOfSections)")
print("myTableView.numberOfRows: \(myTableView.numberOfRows(inSection: 0))")
for i in 0..<foods.count
if tableView.cellForRow(at: [0, i])?.accessoryType == UITableViewCell.AccessoryType.none
print("item \(i) is UNchecked")
else
print("item \(i) is checked")
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return foods.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath)
cell.textLabel?.text = foods[indexPath.row]
return cell
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
print("x: \(foods[indexPath.row])")
print(indexPath)
if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCell.AccessoryType.checkmark
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.none
else
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark
但我现在想要的是返回一个字符串,其中包含检查到 UIViewController 内的 UITextField 的所有元素。
我想在其上添加以下行为,当用户点击 TextField 时,必须将用户重定向到显示可以检查的元素的 UITableView。
在用户点击 UITableView 的任意数量的元素后,用户将点击 DONE 按钮,该按钮将获取所有选中元素的文本(字符串)并将其返回给 UITextField。
如何将字符串返回给 UIViewController 中的 UITextField。
您可以在下面找到我创建的屏幕图像。
编辑
我放了另一个屏幕截图来显示我的代码现在在做什么。
.
我想返回选中的文本,未选中的文本。
另一个编辑
我能够使用下面的代码获得检查元素的String结果,现在我仍然需要知道如何将数据返回到之前的UIViewController
@objc func avancar()
textToReturn = ""
for i in 0..<foods.count
if tableView.cellForRow(at: [0, i])?.accessoryType == UITableViewCell.AccessoryType.none
print("item \(i) is UNchecked")
else
textToReturn = textToReturn + foods[i] + ", "
print("textToReturn: \(textToReturn)")
【问题讨论】:
如何使用:if let indexPaths = tableView.indexPathsForSelectedRows indexPaths.forEach print("Index path: \($0) is selected with text: food[$0.row]
? developer.apple.com/documentation/uikit/uitableview/…
@Larme 我遇到的问题是将字符串返回给 UIViewController。您的代码能够获取选定的单元格,但我想取回选中的单元格。我现在编辑问题。
【参考方案1】:
使用自定义结构来维护选定状态。这是最方便的方式
struct Food
let name : String
var isSelected = false
声明数据源
let foods = [Food(name:"tomato"),
Food(name:"cheese"),
Food(name:"bread"),
Food(name:"apple")]
在cellForRow
中根据isSelected
属性设置附件视图
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return foods.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath)
cell.textLabel?.text = foods[indexPath.row].name
cell.accessoryType = foods[indexPath.row].isSelected ? .checkmark : .none
return cell
在didSelect
中切换数据源中的isSelected
属性并重新加载行
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
print("x: \(foods[indexPath.row])")
foods[indexPath.row].isSelected.toggle()
tableView.reloadRows(at: [indexPath], with: .none)
在动作方法filter
选中的项目,map
他们的名字和join
他们一个字符串。
@objc func avancar(sender: UIBarButtonItem)
print("DONE button clicked")
let selectedItems = foods.filter$0.isSelected.map$0.name.joined(separator: ", ")
print(selectedItems)
【讨论】:
以上是关于使用导航按钮从 UITableView 中的选中元素返回数据的主要内容,如果未能解决你的问题,请参考以下文章
UITableView(不使用导航模板)从 plist 获取特定数据
用于在 Swift 中删除 UITableView 中的行的编辑按钮不起作用