【发布时间】:2018-06-06 23:34:54
【问题描述】:
当我尝试将数据从我的 UITableView 传递到另一个 UIViewController 时,我遇到了一个问题。我应该如何处理我的“If”语句才能传递每个选定单元格上的数据?你们能帮我一把吗?
视图控制器:
import UIKit
class ViewController: UIViewController, UICollectionViewDataSource, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableViewTopSell: UITableView!
@IBOutlet var collectionView: UICollectionView!
@IBOutlet weak var collectionViewBanner: UICollectionView!
var dataSource: [Content] = [Content]()
var dataBanner: [Banner] = [Banner]()
var dataTopSold: [Top10] = [Top10]()
override func viewDidLoad() {
super.viewDidLoad()
//Delegate TableView
self.tableViewTopSell.delegate = self
//SetupNavBarCustom
self.navigationController?.navigationBar.CustomNavigationBar()
let logo = UIImage(named: "tag.png")
let imageView = UIImageView(image:logo)
self.navigationItem.titleView = imageView
//CallAPIData
getTopSold { (data) in
DispatchQueue.main.async {
self.dataTopSold = data
self.tableViewTopSell.reloadData()
}
}
getBanner { (data) in
DispatchQueue.main.async {
self.dataBanner = data
self.collectionViewBanner.reloadData()
}
}
getAudiobooksAPI { (data) in
DispatchQueue.main.async {
self.dataSource = data
self.collectionView.reloadData()
}
}
}
//CollectionView
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if (collectionView == self.collectionView) {
return self.dataSource.count
}else{
return self.dataBanner.count
}}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if (collectionView == self.collectionView) {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! CollectionViewCell
let content = self.dataSource[indexPath.item]
cell.bookLabel.text = content.descricao
cell.bookImage.setImage(url: content.urlImagem, placeholder: "")
return cell
}else if (collectionView == self.collectionViewBanner) {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCellBanner", for: indexPath) as! CollectionViewCell
let content = self.dataBanner[indexPath.item]
cell.bannerImage.setImage(url: content.urlImagem, placeholder: "")
return cell
}
return UICollectionViewCell()
}
//TableView
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.dataTopSold.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "topSoldCell", for: indexPath) as! TableViewCell
let content = self.dataTopSold[indexPath.item]
cell.labelNomeTopSell.text = content.nome
cell.imageViewTopSell.setImage(url: content.urlImagem, placeholder: "")
cell.labelPrecoDe.text = "R$ \(content.precoDe)"
cell.labelPrecoPor.text = "R$ 119.99"
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "segueId", sender:self.dataTopSold[indexPath.item])
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segueId" {
let des = segue.destination as! TelaDetalheProdutos
des.stringNomeeDesc = sender as? String
}
}
}
extension UIImageView{
func setImage(url : String, placeholder: String, callback : (() -> Void)? = nil){
self.image = UIImage(named: "no-photo")
URLSession.shared.dataTask(with: NSURL(string: url)! as URL, completionHandler: { (data, response, error) -> Void in
guard error == nil else{
return
}
DispatchQueue.main.async(execute: { () -> Void in
let image = UIImage(data: data!)
self.image = image
if let callback = callback{
callback()
}
})
}).resume()
}
}
有声书文件:
import Foundation
//Categorias
struct Contents : Decodable {
let data : [Content]
}
struct Content : Decodable {
let id : Int
let descricao : String
let urlImagem : String
}
//Banner
struct BannerData : Decodable {
let data : [Banner]
}
struct Banner : Decodable {
let id : Int
let urlImagem : String
let linkUrl : String
}
//Top10
struct Top10Data:Decodable {
let data: [Top10]
}
struct Top10:Decodable {
let id : Int
let nome : String
let urlImagem : String
let descricao : String
let precoDe : Int
}
详细视图控制器:
import UIKit
class TelaDetalheProdutos: UIViewController {
//Properties
@IBOutlet weak var ImageView: UIImageView!
@IBOutlet weak var labelNomeEDesc: UILabel!
@IBOutlet weak var labelDe: UILabel!
@IBOutlet weak var labelPor: UILabel!
@IBOutlet weak var labelNomeProduto: UILabel!
@IBOutlet weak var labelDescricao: UILabel!
//Strings
var stringImageView = String()
var stringNomeeDesc = String()
var stringLabelDe = String()
var stringLabelPor = String()
var stringNomeProduto = String()
var stringlabeDescricao = String()
override func viewDidLoad() {
super.viewDidLoad()
***//What should I do here?***
}
}
[编辑 1]:
我正在这样做,但我遇到了这个崩溃:
无法将类型“Top10”的值分配给类型“String”
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "topSoldCell", for: indexPath) as! TableViewCell
let content = self.dataTopSold[indexPath.item]
cell.labelNomeTopSell.text = content.nome
cell.imageViewTopSell.setImage(url: content.urlImagem, placeholder: "")
cell.labelPrecoDe.text = "R$ \(content.precoDe)"
cell.labelPrecoPor.text = "R$ 119.99"
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "segueId", sender:self.dataTopSold[indexPath.row])
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segueId" {
let des = segue.destination as! TelaDetalheProdutos
des.stringNomeeDesc = sender as! Top10
}
}
[Edit 3] -SOLVED - 发生的事情是在 Storyboard 中我将 UITableViewCell 链接到另一个屏幕而不是链接 ViewController .这就是它出现两次的原因。
当屏幕在选择单元格后进行转换时,包含结果的下一个屏幕会自动出现两次。第一次它有空字段,并且在 1 秒或更短时间后,会再次自动转换,但这次包含我传递的所有数据。当我单击“返回”TopBar 按钮时也会发生同样的情况。可能会发生什么?
【问题讨论】:
-
将选定的
indexPath传递为sender而不是self然后您可以在prepareFor中使用它从您的模型中获取相关对象并将其设置为属性你的目标视图控制器 -
你好@Paulw11!等一下。那么,我通过 indexPath 还是 IndexPath.row?之后,if语句如何说:cell.labelName.text等?
-
您可以传递 indexPath 或行。只要您在
prepareFor中正确地贬低它,这并不重要。您可以从self.dataTopSold获取相关对象 -
首先,不要使用
item,在处理表格时使用row。二、数组中对象的类型是什么?它们不是字符串,因此强制向下转换为字符串会崩溃。将其转换为正确的对象类 -
明白了!数组中的对象类型都是字符串,只有一个是 Int。我刚刚使用完整的 UIViewController 文件以及包含我所有结构的 AudioBook 文件更新了帖子。请检查一下好吗?
标签: ios swift uitableview segue