如何在 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 中比较和显示不同的数组计数