如何在 swift 中的 tableview 中的 numberOfRowsInSection 中比较和显示不同的数组计数

Posted

技术标签:

【中文标题】如何在 swift 中的 tableview 中的 numberOfRowsInSection 中比较和显示不同的数组计数【英文标题】:How to compare and display different array count in numberOfRowsInSection in tableview in swift 【发布时间】:2019-10-31 10:50:37 【问题描述】:

我有带标签的表格视图,我需要在表格视图中为不同的类别显示不同的数组计数。为此,我为不同的类别采用了不同的数组,但我无法检查条件,所有时间条件都达到numberOfRowsInSection 中的外部返回计数,并且我在 tableview 中获取所有类别值。 我必须将 homeVC typeName 与 AllMakePaymentViewController 类别名称进行比较,并在 tableview 中相应地显示。

用于保存和选择在 AllMakePaymentViewController 表视图中显示类别值的类型的 HomeVC 代码:

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 

if itemsArray[indexPath.item].typeName == "WATER"
    let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "AllMakePaymentViewController") as? AllMakePaymentViewController
    self.navigationController?.pushViewController(nextViewController!, animated: true)

else if itemsArray[indexPath.item].typeName == "ELECTRICITY"
    let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "AllMakePaymentViewController") as? AllMakePaymentViewController
    self.navigationController?.pushViewController(nextViewController!, animated: true)

else if itemsArray[indexPath.item].typeName == "CASH POINT"
    let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "AllMakePaymentViewController") as? AllMakePaymentViewController
    self.navigationController?.pushViewController(nextViewController!, animated: true)

else
    AlertFun.ShowAlert(title: "", message: "will update soon..", in: self)



 //MARK:- Service-call
  func homeServiceCall()

    do
        let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
        //print("the home json is \(jsonObj)")
        let financerArray = jsonObj["financer"] as! [[String: Any]]

        for financer in financerArray 
            let id = financer["id"] as? String
            let pic = financer["icon"] as? String
            self.typeName = financer["tpe"] as! String
            KeychainWrapper.standard.set(self.typeName!, forKey: "typeName")
            var saveTypenameKey = KeychainWrapper.standard.string(forKey: "typeName")
            print("keychain typename \(KeychainWrapper.standard.set(self.typeName!, forKey: "typeName"))")
            self.itemsArray.append(JsonData(icon: pic ?? "", tpe: self.typeName ?? "", id: id ?? ""))
        
    
    catch 
        print("catch error")
    
).resume()

AllMakePaymentViewController 代码:

import UIKit

class PaymentTableViewCell: UITableViewCell
@IBOutlet weak var pamntTypeLabel: UILabel!


class AllMakePaymentViewController: UIViewController 

@IBOutlet weak var tableView: UITableView!
var electricityArray = [String]()
var waterArray = [String]()
var iteamsArray = [String]()

var categoryName: String?
override func viewDidLoad() 
    super.viewDidLoad()
    allPaymentService()

func allPaymentService()

    let urlStr = "https://dev.com/webservices/api.php?rquest=billermdm"
    let url = URL(string: urlStr)
    URLSession.shared.dataTask(with: url!, completionHandler: (data, response, error) in
        guard let respData = data else 
            return
        
        guard error == nil else 
            print("error")
            return
        
        do
            let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
            //print("the all make payment json is \(jsonObj)")
            let billerdetailsArray = jsonObj["billerdetails"] as! [[String: Any]]

            for billerdetail in billerdetailsArray 
                self.categoryName = billerdetail["bcategoryname"] as? String

                if self.categoryName == "Water"
                    let bName = billerdetail["bname"] as? String
                    self.waterArray.append(bName ?? "")
                
                if self.categoryName == "cashpoint"
                    let bName = billerdetail["bname"] as? String
                    self.iteamsArray.append(bName ?? "")
                
                if self.categoryName == "Electricity"
                    let bName = billerdetail["bname"] as? String
                    self.electricityArray.append(bName ?? "")
                
            
            DispatchQueue.main.async 
                self.tableView.reloadData()
            
        
        catch 
            print("catch error")
        
    ).resume()



extension AllMakePaymentViewController: UITableViewDelegate, UITableViewDataSource 

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

    if categoryName == "Water"
        return waterArray.count
    
    if categoryName == "cashpoint"
        return iteamsArray.count
    
    if categoryName == "Electricity"
        return electricityArray.count
    
    return iteamsArray.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PaymentTableViewCell

    if categoryName == "Electricity"
        cell.pamntTypeLabel.text = electricityArray[indexPath.row]
    
    if categoryName == "Water"
        cell.pamntTypeLabel.text = waterArray[indexPath.row]
    
    if categoryName == "cashpoint"
        cell.pamntTypeLabel.text = iteamsArray[indexPath.row]
    
    else
    
        cell.pamntTypeLabel.text = iteamsArray[indexPath.row]
    
    self.tableView.separatorStyle = .none

    return cell


如何比较从 didselectItematIndex 中选择的 homeVC typeName 与 AllMakePaymentViewController 类别名称,并在表格视图标签中仅显示选定的项目类别名称值。请在上面的代码中帮助我。卡在这里很久了。

【问题讨论】:

太长的问题不会引起太多关注。 您只需要发布相关的代码——所有来自 JSON 的加载都与问题无关。但是,在下面发布了一个大纲答案,应该可以为您提供足够的帮助。 【参考方案1】:

您需要将类别顶部注入到 nextViewControllers 中,以便它知道要显示哪些数据。为了尽量减少字符串文字的使用,我将它们转换为枚举,并更改了代码以使用它。

enum Category: String 
  case water = "WATER"
  case electricity = "ELECTRICITY"
  case cashpoint = "CASHPOINT"


func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
  let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "AllMakePaymentViewController") as? AllMakePaymentViewController
  switch Category(rawValue: [indexPath.item].typeName) 
    case .water: nextViewcontroller.category = .water
    case .electricity: nextViewcontroller.category = .electricity
    case .cashpoint: nextViewcontroller.category = .cashpoint
    default: AlertFun.ShowAlert(title: "", message: "will update soon..", in: self)
  
  self.navigationController?.pushViewController(nextViewController!, animated: true)

class AllMakePaymentViewController: UIViewController 

  @IBOutlet weak var tableView: UITableView!
  var electricityArray = [String]()
  var waterArray = [String]()
  var iteamsArray = [String]()

  var category: Category?

  //load data etc


extension AllMakePaymentViewController: UITableViewDelegate, UITableViewDataSource 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
  guard let category = category else return 0
  switch category 
    case .electricity: return electricityArray.count
    case .water: return waterArray.count
    case .cashpoint: return iteamsArray.count
  


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
  let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PaymentTableViewCell

  guard let category = category else return 0
  switch category 
    case .electricity: cell.pamntTypeLabel.text = electricityArray[indexPath.row]
    case .water: cell.pamntTypeLabel.text = waterArray[indexPath.row]
    case .cashpoint: cell.pamntTypeLabel.text = iteamsArray[indexPath.row]
  
    self.tableView.separatorStyle = .none
    return cell
  

注意:无法编译它,所以可能是小错别字,但它应该为您提供所需的基础。询问 XCode 是否抛出任何语法错误。

【讨论】:

didSelectItemAt 在 homVC 和 Category 在 anotherVC.. 很少出现错误,所以我可以通过 github 链接分享我的代码,这样你就可以运行并解决问题.. 我被困在这里很久了 @swift 抱歉,我没有时间调试您的整个代码库。如果您有具体问题,可以在这里问他们,人们会提供帮助,但您确实需要先自己做出努力。如果上面的代码已经解决了所提出的具体问题,请您将其标记为已接受,或者评论解释为什么没有。 好的,没问题,实际上我需要将homeVC typeName与AllMakePaymentViewController categoryName进行比较,并在tableview中显示相关值。该怎么做? 如何比较其他VC中的一个VC值 您需要在实例化之后但在推送之前将值注入新 VC,如上例所示,它在 AllMakePaymentViewController 中比较原始 VC 的类别值跨度>

以上是关于如何在 swift 中的 tableview 中的 numberOfRowsInSection 中比较和显示不同的数组计数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中的 tableview 中的 didselectrow 方法中点击内容视图

如何在 Swift 中的 View 中控制 TableView

如何在 Swift 中的 tableview 之间显示单独的 View(box)

如何在 swift 中的 tableview 中的 numberOfRowsInSection 中比较和显示不同的数组计数

如何在 swift 4 中的 tableView Cell 中创建 collectionview? [复制]

Swift:如何将单元格发送到 TableView 中的正确部分?