如何在 swift 中返回 tableView numberOfRowsInSection 中的不同数组计数

Posted

技术标签:

【中文标题】如何在 swift 中返回 tableView numberOfRowsInSection 中的不同数组计数【英文标题】:How to return different array count in tableView numberOfRowsInSection in swift 【发布时间】:2019-10-30 15:04:47 【问题描述】:

我有一个包含一个标签的单元格的 tableView.. 我需要为不同的类别显示不同的标签文本。 为此,我创建了空的 itamArray,我正在尝试使用 if 条件为不同的类别附加 itamArray。以同样的方式,我需要在numberOfRowsInSection 中返回数组计数,但在这里我无法检查是否条件,如果我给出 return itamArray.count 它只会在返回时出现,然后如果我给出返回 0 它会显示所有类别值表格视图中没有任何内容。

如果我点击水,我只需要在 tabelview 中显示与水相关的 itamsArray。但在这里,如果我点击任何类别,它会在 tableview 中显示所有类别相关的值。请在代码中帮助我。

这是我的代码:

import UIKit

class PaymentTableViewCell: UITableViewCell

@IBOutlet weak var pamntTypeLabel: UILabel!


class AllMakePaymentViewController: UIViewController 

@IBOutlet weak var tableView: UITableView!

var categoryName: String?
var iteamsArray = [String]()
override func viewDidLoad() 
    super.viewDidLoad()
    allPaymentService()

func allPaymentService()

    let urlStr = "https://dev.com/webservices/api.php?rquest"
    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.iteamsArray.append(bName ?? "")
                    print("water arry \(self.iteamsArray.append(bName ?? ""))")
                
                if self.categoryName == "Landline Postpaid"
                    let bName = billerdetail["bname"] as? String
                    self.iteamsArray.append(bName ?? "")
                    print("Landline arry \(self.iteamsArray.append(bName ?? ""))")
                
                if self.categoryName == "DTH"
                    let bName = billerdetail["bname"] as? String
                    self.iteamsArray.append(bName ?? "")
                    print("DTH arry \(self.iteamsArray.append(bName ?? ""))")
                
                if self.categoryName == "Electricity"
                    let bName = billerdetail["bname"] as? String
                    self.iteamsArray.append(bName ?? "")
                    print("Electricity arry \(self.iteamsArray.append(bName ?? ""))")
                
            
            DispatchQueue.main.async 
                self.tableView.reloadData()
            
        
        catch 
            print("catch error")
        
    ).resume()



extension AllMakePaymentViewController: UITableViewDelegate, UITableViewDataSource 

func numberOfSections(in tableView: UITableView) -> Int 
    return 1


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

    if categoryName == "Water"
        return iteamsArray.count
    
    if categoryName == "Landline Postpaid"
        return iteamsArray.count
    
    if categoryName == "DTH"
        return iteamsArray.count
    
    if categoryName == "Electricity"
        return iteamsArray.count
    
    return iteamsArray.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PaymentTableViewCell
    cell.pamntTypeLabel.text = iteamsArray[indexPath.row]
    self.tableView.separatorStyle = .none
    return cell


请在上面的代码中帮助我。

【问题讨论】:

【参考方案1】:

当你在这里将所有项目嵌入到同一个数组中时

            if self.categoryName == "Water"
                let bName = billerdetail["bname"] as? String
                self.iteamsArray.append(bName ?? "")
                print("water arry \(self.iteamsArray.append(bName ?? ""))")
            
            if self.categoryName == "Landline Postpaid"
                let bName = billerdetail["bname"] as? String
                self.iteamsArray.append(bName ?? "")
                print("Landline arry \(self.iteamsArray.append(bName ?? ""))")
            
            if self.categoryName == "DTH"
                let bName = billerdetail["bname"] as? String
                self.iteamsArray.append(bName ?? "")
                print("DTH arry \(self.iteamsArray.append(bName ?? ""))")
            
            if self.categoryName == "Electricity"
                let bName = billerdetail["bname"] as? String
                self.iteamsArray.append(bName ?? "")
                print("Electricity arry \(self.iteamsArray.append(bName ?? ""))")
            

即使categoryName 是不同的,你更需要

var iteamsArray = [Category]()
var filteredArray = [Category]()

guard let res = try? JSONDecoder().decode(Root.self,from:data) else  return 
self.iteamsArray = res.billerdetails

struct Root 
    let billerdetails:[Category]


struct Category 
    let bcategoryname,bname:String

然后在表格中使用filteredArray,当您需要更改类别时,请执行

self.filteredArray = itemsArray.filter $0.bcategoryname == "Water" 
self.tableView.reloadData()

【讨论】:

你是对的,我将所有值附加到同一个数组......但在你的回答中,我如何在不使用 JSONDecoder() 的情况下实现这一点......请在代码中帮助我 我已经发布了我所有的代码,如果我做错了什么请在这里修改

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

如何在swift中的动态表视图中创建动态表视图?

如何在tableView swift的Xib Cell中创建内部视图动态

在 Swift 中加速 TableView 加载 JSON

Swift:选择搜索结果后返回tableview

TableView 在 Swift 中推送到详细视图

如何在 Swift 中本地化 tableView 单元格?