【问题标题】:Switch between tableViews using segmented Control使用分段控件在 tableViews 之间切换
【发布时间】:2022-01-03 15:58:55
【问题描述】:

我有一个显示多个任务的 tableView,我想以编程方式在 2 个数据源之间切换。我创建了一个显示在顶部的分段控件,但是当我单击按钮时没有任何变化,而且我不知道如何将分段控件链接到我的数据源,这是我的代码:

class MyTasksCollectionCell: UICollectionViewCell, UITableViewDelegate, UITableViewDataSource {
   
    var tasks = [Add]()
    var pastTasks = [Add]()
    
    static let identifier = "MyTasksCollectionCell"
    private let cellID = "CellID"
         
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.tasks.count

        }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   
        let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! MyTasksTableCell
        cell.accessoryType = .disclosureIndicator
             
        cell.categoryLabel.text =
            "\(tasks[indexPath.row].category)"
        cell.dateLabel.text =
            "\(tasks[indexPath.row].date)"
        cell.hourLabel.text =
            "\(tasks[indexPath.row].hour)"
        
        if cell.categoryLabel.text == "Urgent" {
            cell.categoryIcon.image = #imageLiteral(resourceName: "red.png")
        }
        if cell.categoryLabel.text == "Important" {
            cell.categoryIcon.image = #imageLiteral(resourceName: "orange.png")
        }
        if cell.categoryLabel.text == "Not Important" {
            cell.categoryIcon.image = #imageLiteral(resourceName: "green.png")
        }
        cell.dateIcon.image = UIImage(systemName: "calendar.badge.clock")

        return cell
          
    }
    
         func addControl() {
           let segmentItems = ["Present Tasks", "Past Tasks"]
           let control = UISegmentedControl(items: segmentItems)
           control.frame = CGRect(x: 10, y: 0, width: (self.tableView.frame.width - 20), height: 30)
           control.addTarget(self, action: #selector(segmentControl(_:)), for: .valueChanged)
           control.selectedSegmentIndex = 0
            tableView.addSubview(control)
        }

        @objc func segmentControl(_ segmentedControl: UISegmentedControl) {
           switch (segmentedControl.selectedSegmentIndex) {
              case 0:
                 // First segment tapped
                print("Present Tasks")
                self.tableView.reloadData()
              break
              case 1:
                 // Second segment tapped
                print("Past Tasks")
                 self.tableView.reloadData()
              break
              default:
              break
           }
        }
    }

【问题讨论】:

    标签: ios swift xcode uitableview uisegmentedcontrol


    【解决方案1】:

    根据段控制值使用枚举来了解标签中显示的内容:

    enum DispkayedTasks {
        case current
        case past
    }
    var displayedTask = DisplayedTasks.current
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int         {
        switch (displayedTask) {
              case .current:
                 // First segment tapped
                return self.tasks.count
              case .past:
                 // Second segment tapped
                return self.pastTasks.count
           }
        }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! MyTasksTableCell
        cell.accessoryType = .disclosureIndicator
        let task = {() -> Add in
            switch (displayedTask) {
              case .current:
                 // First segment tapped
                return self.tasks[indexPath.row]
              case past:
                 // Second segment tapped
                return self.pastTasks[indexPath.row]
            }
        }()
             
        cell.categoryLabel.text =
            "\(task.category)"
        cell.dateLabel.text =
            "\(task.date)"
        cell.hourLabel.text =
            "\(task.hour)"
        
        if cell.categoryLabel.text == "Urgent" {
            cell.categoryIcon.image = #imageLiteral(resourceName: "red.png")
        }
        if cell.categoryLabel.text == "Important" {
            cell.categoryIcon.image = #imageLiteral(resourceName: "orange.png")
        }
        if cell.categoryLabel.text == "Not Important" {
            cell.categoryIcon.image = #imageLiteral(resourceName: "green.png")
        }
        cell.dateIcon.image = UIImage(systemName: "calendar.badge.clock")
    
        return cell
          
    }
    
      @objc func segmentControl(_ segmentedControl: UISegmentedControl) {
           switch (segmentedControl.selectedSegmentIndex) {
              case 0:
                 // First segment tapped
                print("Present Tasks")
                displayedTasks = .current
                self.tableView.reloadData()
           
              case 1:
                 // Second segment tapped
                print("Past Tasks")
                displayedTasks = .past
    
                 self.tableView.reloadData()
             
              default:
              break
           }
        }
    

    【讨论】:

    • 谢谢!但我不知道它是否有效,我添加了你的代码,但是当我点击 pastTasks 部分时,我的应用程序崩溃了,我得到一个“线程 1:致命错误:索引超出范围:文件 Swift/ContiguousArrayBuffer.swift,第 444 行” (在 cell.categoryLabel.text = "(task.category)" 行):/
    • 你能在任务变量发生之前检查它里面的值吗?
    • 我在 tableView 函数的开头(错误行之前)添加了“print(indexPath.row, pastTasks.count)”,它返回了这个“0 6 1 6 2 6”
    • 这很奇怪,当我在 switch (displayedTask) { case .current: 内移动 cell.categoryLabel.text = "\(task.category)" cell.dateLabel.text = "\(task.date)" cell.hourLabel.text = "\(task.hour)" 时,我可以看到您的代码正在工作,因为 tableview 更改但没有数据(仅显示 calendar.badge.clock 图标)
    • 我忘记了 "}()" 在 steting 任务变量时结束闭包。可能是这个原因。
    猜你喜欢
    • 2012-03-13
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多