如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器
Posted
技术标签:
【中文标题】如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器【英文标题】:How to push different view controller from collection view didSelectItemAt based on Json id in swift 【发布时间】:2019-09-28 11:49:06 【问题描述】:我的项目包含 collectionView.. 但如何根据 json id 从 didSelectItemAt 推送不同的视图控制器。我为每个 id 设置了单独的 vewcontroller .. 但我无法使用基于 json id 的 didSelectItemAt 推送不同的视图控制器。
这是我用于 collectionView 的 Json:
"financer": [
"id": "45",
"icon": "https://hello.com//images/img1.png"
"id": "40",
"icon": "https://hello.com//images/img2.png"
.
.
.
]
这是我家的收藏查看代码:
import UIKit
struct JsonData
var iconHome: String?
init(icon: String, tpe: String)
self.iconHome = icon
class HomeViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource
@IBOutlet weak var collectionView: UICollectionView!
var itemsArray = [JsonData]()
var idArray = [String]()
override func viewDidLoad()
super.viewDidLoad()
homeServiceCall()
//Do any additional setup after loading the view.
collectionView.delegate = self
collectionView.dataSource = self
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return itemsArray.count
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! HomeCollectionViewCell
let aData = itemsArray[indexPath.row]
cell.paymentLabel.text = aData.typeName
if let url = NSURL(string: aData.iconHome ?? "")
if let data = NSData(contentsOf: url as URL)
cell.paymentImage.image = UIImage(data: data as Data)
return cell
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "MakePaymentViewController") as! MakePaymentViewController
self.navigationController?.pushViewController(nextViewController, animated: true)
let indexPathHome = indexPath.row
print("home collectionItem indexpath \(indexPathHome)")
//MARK:- Service-call
func homeServiceCall()
let urlStr = "https://dev.com/webservices/getfinancer"
let url = URL(string: urlStr)
URLSession.shared.dataTask(with: url!, completionHandler: (data, response, error) in
guard let respData = data else
return
do
let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
let financerArray = jsonObj["financer"] as! [[String: Any]]
for financer in financerArray
let id = financer["id"] as! String
let pic = financer["icon"] as? String
print("home financer id \(id)")
self.idArray.append(id)
print("the home financer idsArray \(self.idArray.append(id))")
self.itemsArray.append(JsonData(icon: pic ?? ""))
DispatchQueue.main.async
self.collectionView.reloadData()
catch
print("catch error")
).resume()
当我单击 collectionview 中的任何项目时,我可以推送相同的视图控制器,但我需要根据 json id 推送不同的视图控制器。我不知道如何以及在何处使用 json id 使用 didselectItem atIndexPath 推送不同的视图控制器。任何人都请在这里帮助我。
【问题讨论】:
【参考方案1】:更新您的 homeServiceCall
函数
func homeServiceCall()
let urlStr = "https://dev.com/webservices/getfinancer"
let url = URL(string: urlStr)
URLSession.shared.dataTask(with: url!, completionHandler: (data, response, error) in
guard let respData = data else
return
do
let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
let financerArray = jsonObj["financer"] as! [[String: Any]]
for financer in financerArray
let id = financer["id"] as! String
let pic = financer["icon"] as? String
self.itemsArray.append(JsonData(icon: pic ?? ""))
self.idArray.append(id)
DispatchQueue.main.async
self.collectionView.reloadData()
catch
print("catch error")
).resume()
在您的MakePaymentViewController
中创建一个名为financerId
的字符串属性
在您的 didSelect
函数中
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
if let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "MakePaymentViewController") as? MakePaymentViewController
nextViewController.finacerId = idArray[indexPath.row]
self.navigationController?.pushViewController(nextViewController, animated: true)
更新
for financer in financerArray
if let id = financer["id"] as? Int
self.idArray.append(id)
if let pic = financer["icon"] as? String
elf.itemsArray.append(JsonData(icon: pic))
【讨论】:
我没有在 idArray 中获得 ids...控制台中的家庭财务人员 idsArray ()...如果我打印单独的 id...家庭财务人员 id 45 这就是为什么我建议你修改 homeServiceCall 函数,添加那行self.idArray.append(id)
你将有一个数组存储所有 ids
是的,我是在家庭服务电话中做到的。我已经更新了我的帖子
@iosSwift 当然,我相信问题出在你解析 json 的方式上,顺便说一下,请注意强制转换(!),尽量避免它,使用if let
& @改为 987654330@
您的解决方案是正确的,但我无法将 id 添加到数组中,但如果我将它提供给字符串,我会得到单个 id。如果你有时间,你能告诉我为什么会发生这样的事情。和感谢您提供有关(!)的解决方案的建议。如果让并保护让,我会遵循以上是关于如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
Swift UI集合视图 - 如何在Cell中显示“segued”用户输入?
使用 POST 请求 iOS Swift 3 发送嵌套 JSON
如何在 swift 3.0 中制作 5*8 集合视图 [关闭]