Как вернуть различное количество массивов в tableView numberOfRowsInSection в swift - PullRequest
0 голосов
/ 30 октября 2019

У меня есть tableView с одной ячейкой, которая содержит одну метку. Мне нужно отобразить другой текст метки для другой категории. для этого я создал пустой iteamArray и пытаюсь добавить iteamArray для другой категории, используя условие if. таким же образом мне нужно вернуть количество массивов в numberOfRowsInSection, но здесь я не могу проверить, выполняется ли условие, оно выходит за пределы возврата, только если я возвращаю iteamArray.count, тогда оно отображает все значения категории, если я возвращаю 0, оно отображаетничего в табличном представлении.

если я щелкаю воду, мне нужно показывать только связанные с водой iteamsArray в tabelview .. но здесь, если я щелкаю любую категорию, она показывает все связанные с категориями значения в табличном представлении .. пожалуйста, помогите мне в коде.

вот мой код:

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 Ответ

0 голосов
/ 30 октября 2019

Это, поскольку вы встраиваете все элементы в один и тот же массив здесь

            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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...