如何将 tableview 部分的选定索引添加到数组

Posted

技术标签:

【中文标题】如何将 tableview 部分的选定索引添加到数组【英文标题】:How to add selected indexes of tableview sections to an array 【发布时间】:2019-06-22 00:37:38 【问题描述】:

我有一个tableViewsection headers,我想将某个用户输入附加到多个选定的headers。我已经创建了section headers,并且能够更改section header 上的图像以显示它已被选中,但我想创建一个array 的选中对象。

这是我的section header 代码:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
    let userModel = Data.userModels[section]
    let cell = tableView.dequeueReusableCell(withIdentifier: "nameCell") as! NameHeaderTableViewCell

    cell.setup(model: userModel)
    cell.checkMarkButton.addTarget(self, action: #selector(handleTap), for: .touchUpInside)
    cell.enable(on: false)
    if isUserEditing == true 
        cell.enable(on: true)
    
    return cell.contentView

这是我在用户点击该部分时更改section image 的地方:

    @objc func handleTap(sender: UIButton) 

    sender.isSelected = !sender.isSelected


当用户单击保存button 时,我希望将用户输入附加到选择了section header 的那些单元格中。这是代码:

@IBAction func save(_ sender: Any) 
    //VALIDATION
    guard  mealItemTextField.text != "", let item = mealItemTextField.text else 
        mealItemTextField.placeholder = "please enter an item"
        mealItemTextField.layer.borderWidth = 1
        mealItemTextField.layer.borderColor = UIColor.red.cgColor
        return
    
    guard  priceTextField.text != "", let price = Double(priceTextField.text!) else 
        priceTextField.placeholder = "please enter a price"
        priceTextField.layer.borderWidth = 1
        priceTextField.layer.borderColor = UIColor.red.cgColor
        return
    
        tableView.reloadData()

目前我被困在如何访问所有被选中的sections 中的indexes(即处于选中状态的那些)以下是一些有助于可视化程序的屏幕截图:

P.S. 不确定这是否有帮助,但我使用 arraystructs 填充数据。这是代码:

func numberOfSections(in tableView: UITableView) -> Int 
        return Data.userModels.count

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        if Data.userModels[section].isExpandable 
            return Data.userModels[section].itemModels.count
         else 
            return 0
    


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
    if cell == nil 
        cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    
    cell?.textLabel?.text = Data.itemModels[indexPath.row].itemName
    return cell!

感谢任何帮助,谢谢!

【问题讨论】:

【参考方案1】:

问题在于您的复选标记只是标题的视觉特征。当用户点击复选标记时,您只是切换其选中状态:

@objc func handleTap(sender: UIButton) 
    sender.isSelected = !sender.isSelected

那是行不通的。您需要在处理节标题的数据模型的一部分中始终跟踪此信息。这样,当单击 Save 按钮时,信息就在数据模型中等待您。您的handleTap 需要确定这是哪个部分的标题,并将信息反映到模型中。数据模型是事实的来源,而不是界面中的某些视图。 (我很惊讶当您滚动表格视图时您还没有遇到此问题。)

您的代码的另一个问题是:

let cell = tableView.dequeueReusableCell(withIdentifier: "nameCell") as! NameHeaderTableViewCell

您不能将 UITableViewCell 用作可重用的节标题视图。您需要在这里使用 UITableViewHeaderFooterView。

【讨论】:

如果我能访问正确的索引,我觉得数据模型会很好。这些名称来自一组名称,我只想将食品和价格附加到所选名称。 对,你必须有一种方法可以从标题视图到它是标题的部分。

以上是关于如何将 tableview 部分的选定索引添加到数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在tableview的可变数组中存储多个选定的行项

如何将选定的 uitableviewcell 核心数据对象传递给新的视图控制器?

iPhone SDK如何将tableview中plist中的选定行传递到UIViewController

从选定索引处的表视图中的数组中删除

如何将 TableView 中的选定行(JSON)发送到另一个视图控制器?

如何在 iOS Swift 中将选定的 tableView 单元格保存到数组中?