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

У меня есть табличное представление с меткой, мне нужно отобразить различное количество массивов в табличном представлении для другой категории. для этого я взял разные массивы для разных категорий, но не могу проверить условие, все время условие переходит к внешнему счетчику возвращаемых значений в numberOfRowsInSection, и я получаю все значения категорий в табличном представлении. Я должен сравнить homeVC typeName с именем категории AllMakePaymentViewController и отобразить его соответственно в виде таблицы.

Код HomeVC для сохранения и выбора типа для отображения значений категории в виде таблицы AllMakePaymentViewController:

 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 code:

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
}
}

Как сравнить homeVC typeName, выберите из didselectItematIndex имя категории AllMakePaymentViewController и покажите только выбранные значения categoryName элемента в метке табличного представления. пожалуйста, помогите мне в приведенном выше коде. Я застрял здесь на долгое время.

1 Ответ

1 голос
/ 31 октября 2019

Вам нужно сверху добавить категорию в 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 какие-либо синтаксические ошибки.

...