我正在 Expandeble Tableview 上创建一个演示,扩展工作正常......但是在点击 didselect 行时遇到问题

I'm Creating an demo on Expandeble Tableview, Expanding is working Fine... But facing issue while didselect row is tapped

展开和折叠表视图运行良好,仅在点击选择行时遇到问题,我在选择行后每次都获得相同的索引。我得到了相同的输出,我想将数据传递到下一个视图,但输出无法正常工作。

这是我的详细信息...

我的输出 我的模型

struct ItemList {
var name: String
var items: [String]
var collapsed: Bool

init(name: String, items: [String], collapsed: Bool = false) {
     self.name = name
     self.items = items
     self.collapsed = collapsed
    }
}

我的ViewControllerClass

class ViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!
var sections = [ItemList]()
var items: [ItemList] = [
 ItemList(name: "Mac", items: ["MacBook", "MacBook Air"]),
 ItemList(name: "iPad", items: ["iPad Pro", "iPad Air 2"]),
 ItemList(name: "iPhone", items: ["iPhone 7", "iPhone 6"])
]
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
}
}

TableView 扩展

extension ViewController:UITableViewDelegate,UITableViewDataSource{

 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 60
}

  func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerHeading = UILabel(frame: CGRect(x: 5, y: 10, width: self.view.frame.width, height: 40))
let imageView = UIImageView(frame: CGRect(x: self.view.frame.width - 30, y: 20, width: 20, height: 20))
if items[section].collapsed{
    imageView.image = UIImage(named: "collapse")
}else{
    imageView.image = UIImage(named: "expand")
}
let headerView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 60))
let tapGuesture = UITapGestureRecognizer(target: self, action: #selector(headerViewTapped))
tapGuesture.numberOfTapsRequired = 1
headerView.addGestureRecognizer(tapGuesture)
headerView.backgroundColor = UIColor.red
headerView.tag = section
headerHeading.text = items[section].name
headerHeading.textColor = .white
headerView.addSubview(headerHeading)
headerView.addSubview(imageView)
return headerView
}

func numberOfSections(in tableView: UITableView) -> Int {
  return items.count
 }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{
let itms = items[section]
return !itms.collapsed ? 0 : itms.items.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> 
  UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
cell.textLabel?.text = items[indexPath.section].items[indexPath.row]
return cell
 }

@objc func headerViewTapped(tapped:UITapGestureRecognizer){
print(tapped.view?.tag)
if items[tapped.view!.tag].collapsed == true{
    items[tapped.view!.tag].collapsed = false
}else{
    items[tapped.view!.tag].collapsed = true
}
if let imView = tapped.view?.subviews[1] as? UIImageView{
    if imView.isKind(of: UIImageView.self){
        if items[tapped.view!.tag].collapsed{
            imView.image = UIImage(named: "collapsed")
        }else{
            imView.image = UIImage(named: "expand")
        }
    }
  }
   tableView.reloadData()
 }

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let row = items[indexPath.row]
    print("IndexPath :- \(row.name)")
}
}

如果您查看 cellForRowAt 单元格中设置文本的方式:

cell.textLabel?.text = items[indexPath.section].items[indexPath.row]

你是说:

  • items 数组
  • 中获取 indexPath.sectionItemList 对象
  • 从这个 indexPath.row
  • 对象的 items 数组中获取字符串

但是,在您的didSelectRowAt中:

let row = items[indexPath.row]
print("IndexPath :- \(row.name)")

你是说:

  • items 数组
  • 中获取 indexPath.rowItemList 对象
  • 打印那个对象的.name属性

因此,更改您的 didSelectRowAt 代码以匹配您的 cellForRowAt 逻辑:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    let selectedString = items[indexPath.section].items[indexPath.row]
    print("IndexPath :- \(selectedString)")

    // or, for a little more clarity
    let sectionObject = items[indexPath.section]
    let rowItem = sectionObject.items[indexPath.row]
    
    print("IndexPath :- \(indexPath)  //  Section :- \(sectionObject.name)  //  Item :- \(rowItem)")
    
}