【问题标题】:how to load selected data from a table view when a segment is selected?选择段时如何从表视图中加载选定的数据?
【发布时间】:2018-04-17 08:47:54
【问题描述】:

我想知道如何从我的表视图加载所选数据,例如选择段索引等于1,表视图将重新加载并且只会显示状态等于批准的数据。因为正如您从下面的代码中看到的那样,我已经加载了具有所有状态的所有数据:.例如,如果 segmentView.selectedSegmentIndex == 1 表将重新加载状态等于已批准的数据。我已经可以确定选定的索引。我想要的是如何从表视图中访问这些数据,我可以根据状态加载选定的数据

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Table view cells are reused and should be dequeued using a cell identifier.
        let cellIdentifier = "ToDoListTableViewCell"
        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ToDoListTableViewCell
        cell.delegate = self


//        let toDoActionItem = fetchedResultsController.object(at: indexPath)

        if let getTempDetails: [String : Any] = getAllDetail[indexPath.row] {
            print("ang tanan data:" , getTempDetails)
            if let str = getTempDetails["status"] as? [String: String] {
                if let name = str["name"] {
                    if name == "ongoing" {
                        cell.toDoItemLabel.text = getTempDetails["name"] as? String
                        cell.statuslabel.backgroundColor = created
//                        cell.label.textColor =  UIColor(red: 0.9294, green: 0.3333, blue: 0.1804, alpha: 1.0)
//                        cell.backgroundColor = created


                    }
                    else if name == "approved" {
                       cell.toDoItemLabel.text = getTempDetails["name"] as? String
                       cell.statuslabel.backgroundColor = done
                       cell.checkBoxButton.isSelected =  true
                    }
                    else if name == "for approval" {
                        cell.toDoItemLabel.text = getTempDetails["name"] as? String
                        cell.statuslabel.backgroundColor = pending
                    }else if name == "near expiry" {
                       cell.toDoItemLabel.text = getTempDetails["name"] as? String
                        cell.statuslabel.backgroundColor = neardue
                    } else if name == "expired" {
                        cell.toDoItemLabel.text = getTempDetails["name"] as? String
                        cell.statuslabel.backgroundColor = expired
                    } else {
                        print("false")
                       cell.toDoItemLabel.text = "LOLS"
                    }
                }
                }
            }



    code for segment (in selecting segment)

    func selectSegmentInSegmentView(segmentView: SMSegmentView) {

        if segmentView.selectedSegmentIndex == 1 {
            print("ang index nga emo ge click is one")
            //            let selectedSegment : SMSegment = segmentView.selectedSegment!
            //            self.userName = selectedSegment.label.text!

        } else {

            logic here
        }
        self.setUpTableView()
or could be self.tableView.reloadData()
    }

【问题讨论】:

  • 您的问题是仅过滤“已批准”/“过期”还是有关 TableView?我会使用“selectedDetailsArray”,它将根据 segmentedControl 选择过滤getAllDetail,并仅将这个用于数据源(numberOfRows、cellForRow 等)
  • 我想要的是例如 segmentView.selectedSegmentIndex == 1 表将加载状态等于批准的数据。
  • 您在分段控制中是否有 5 个分段,分别命名为正在进行、已批准、待批准、即将到期和已过期?
  • 是的索引等于状态数
  • @DurnKurvirck 你能解释一下代码吗?来参加昨天的聊天,我们可以在那里讨论

标签: ios swift uitableview tableview uisegmentedcontrol


【解决方案1】:

最好的选择是:

为Display创建一个通用的array,用于显示tableView中的数据:

并且在所有条件下都像这样使用它:

像这样创建一个通用函数:

   func filterDataStatusWise(strStatus:String){

    for dict in arrMainResponse{

        let strStatus = arrMainResponse["status"]

        if strStatus["name"] = strStatus{
            //Whatever data add in arrForDisplay here
        }

        tableView.reloadData()
    }
}

然后像这样使用它:

var arrForDisplay = [String:Any]()

if condition1{
        filterDataStatusWise(strStatus: "ongoing")
    }else if condition2{
        filterDataStatusWise(strStatus: "approved")
    }else if condition3{
        filterDataStatusWise(strStatus: "for approval")
    }else if condition4{
        filterDataStatusWise(strStatus: "near expiry")
    }else{
        filterDataStatusWise(strStatus: "expired")
    }

希望对你有帮助!

【讨论】:

  • 嗨,先生,您在吗?
  • @DurnKurvirck 我回到了聊天部分,我们可以继续那里
【解决方案2】:

在选择UISegmentControl的不同段时,您只需要创建5个单独的数组来加载。

var ongoingArr = [[String: Any]]() // For segment index 0
var approvedArr = [[String: Any]]() // For segment index 1
var forApprovalArr = [[String: Any]]() // For segment index 2
var nearExpiryArr = [[String: Any]]() // For segment index 3
var expiredArr = [[String: Any]]() // For segment index 4

您拥有完整的数据getAllDetail,并且您正在通过 API 或上一个屏幕获取此数组中的数据:

var getAllDetail = [[String: Any]]()

如果是从 API 获取数据,则在加载 getAllDetail 中的数据后加载 5 个以上的数组。只是将数组的扩展创建为:

extension Array where Element == [String: Any] {

    func filterArray(_ statusName: String) -> [Element] {
        return self.filter { infoDict -> Bool in
            if let statusDict = infoDict["status"] as? [String: String], let name = statusDict["name"] {
                return name == statusName
            }
            return false
        }
    }

}

并且,加载超过 5 个数组:

func loadSegmentArray() {

    ongoingArr = getAllDetail.filterArray("ongoing")
    approvedArr = getAllDetail.filterArray("approved")
    forApprovalArr = getAllDetail.filterArray("for approval")
    nearExpiryArr = getAllDetail.filterArray("near expiry")
    expiredArr = getAllDetail.filterArray("expired")

    // Select 0th index of segment and reload table
    segmentView.selectedSegmentIndex = 0
    self.setUpTableView() // Reload Table view
}

在您的函数selectSegmentInSegmentView 中,只需重新加载表格视图:

func selectSegmentInSegmentView(segmentView: SMSegmentView) {
    self.setUpTableView()
}

并根据这 5 个数组更新您的 UITabelView 委托和数据源方法。

对于示例,我写的是numberOfRowsInSectioncellForRowAt indexPath

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch segmentView.selectedSegmentIndex {
    case 0:
        return ongoingArr.count
    case 1:
        return approvedArr.count
    case 2:
        return forApprovalArr.count
    case 3:
        return nearExpiryArr.count
    case 4:
        return expiredArr.count
    default:
        return 0
    }
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellIdentifier = "ToDoListTableViewCell"
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ToDoListTableViewCell
    cell.delegate = self

    var infoDict = [String: Any]()
    switch segmentView.selectedSegmentIndex {
    case 0:
        infoDict = ongoingArr[indexPath.row]
        cell.statuslabel.backgroundColor = // Color of onging
    case 1:
        infoDict = approvedArr[indexPath.row]
        cell.statuslabel.backgroundColor = // Color of approvedArr
    case 2:
        infoDict = forApprovalArr[indexPath.row]
        cell.statuslabel.backgroundColor = // Color of forApprovalArr
    case 3:
        infoDict = nearExpiryArr[indexPath.row]
        cell.statuslabel.backgroundColor = // Color of nearExpiryArr
    case 4:
        infoDict = expiredArr[indexPath.row]
        cell.statuslabel.backgroundColor = // Color of expiredArr
    default:
        cell.statuslabel.backgroundColor = .black
    }

    cell.toDoItemLabel.text = infoDict["name"] as? String
    return cell
}

【讨论】:

  • 我正在从 API 获取数据
  • 响应API,首先加载getAllDetail,然后调用加载所有5个数组并设置选定段索引= 0然后重新加载表的方法
  • 你能打开一个聊天,我可以通过那里澄清
  • 我创建了一个函数 loadSegmentArray 在加载 getAllDetail 后调用这个函数来响应 API 成功
  • 我找不到聊天选项,我对堆栈溢出有点陌生。
【解决方案3】:

根据所选索引(状态)过滤数组:

func tableView(tableView: UITableView, numberOfRowsInSection section: 
Int) -> Int {

    switch segmentView.selectedSegmentIndex {
    case 0:
        if self.expiredArray == nil {
            return 0
        }
        return (self.expiredArray?.count)!   
    case 1:
        if self.approvedArray == nil {
            return 0
        }
        return (self.complaintArray?.count)!
    default:
        break
    }
    return 0

}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    switch segmentView.selectedSegmentIndex {
    case 0:
    // Load from expired array
    case 1:
    // Load from approved array
    default:
        break
    }
    return UITableViewCell()
}

func selectSegmentInSegmentView(segmentView: SMSegmentView) {
   if segmentView.selectedSegmentIndex == 1 {
   // Write your code to filter array here based on status
   } else {
   // Write your code to filter array here based on status
   }
// reload tableview here.....

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多