选择段时如何从表视图中加载选定的数据?

Posted

技术标签:

【中文标题】选择段时如何从表视图中加载选定的数据?【英文标题】: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 你能解释一下代码吗?来参加昨天的聊天,我们可以在那里讨论 【参考方案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.....


【讨论】:

以上是关于选择段时如何从表视图中加载选定的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将数据从表视图控制器传递到另一个控制器? [复制]

从表视图选择中播放视频 URL

表视图侧视图控制器中的当前选定行

如何将标签中的数据从表视图行操作发送到视图控制器?

如何重新加载 UIPageViewController 以在 Swift 中重新加载其视图

如何将数据从表视图传递到另一个视图控制器