使用导航按钮从 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 表单 UIView

UITableView(不使用导航模板)从 plist 获取特定数据

用于在 Swift 中删除 UITableView 中的行的编辑按钮不起作用

UITableView:重命名编辑按钮(UIBarButtonSystemItemEdit)

UIPopover 和 UITableView 数据交换

在按钮标题上滑动文本,如带有 css 和 javascript 的选框(不是 jQuery)