如何在 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 中比较和显示不同的数组计数的主要内容,如果未能解决你的问题,请参考以下文章