还有很多其他将数据传递到另一个ViewController的主题-我知道-但是我找不到将数据从 UITableViewCell 传递到 UIViewController 的解决方案。这个问题与其他问题不同,在这里我必须访问另一类UITableViewCell中的ImageView。塞格斯,为塞格斯做准备,其他话题在其他帖子中已经讨论得足够多了,但是这个特殊的星座却没有。
我有一个类UITableViewCell:
class PostCell: UITableViewCell {
...
// networkService is downloading an image
networkService.downloadImage({ (imageData) in
let image = UIImage(data: imageData as Data)
...
// image is set to UIImageView
self.postImageView.image = image
在我的ViewController中,我执行此操作以转到DetailViewController:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
aktIndex = indexPath.section
performSegue(withIdentifier: "segueDetail", sender: self)
}
我尝试过:
let MainStory:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let desVC = MainStory.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
desVC.getImage = ???
self.navigationController?.pushViewController(desVC, animated: true)
DetailViewController:
class DetailViewController: UIViewController {
var getImage = UIImage()
...
我在xcode(segueDetail)中进行了segue:
此刻,我将图像数据存储在 UserDefaults 中,并在DetailViewController中再次读取它们。我很奇怪。
我必须从哪里传递数据?在我的 PostCell 还是 ViewController 中?问题是可以从ViewController中的PostCell访问图像数据。
答案 0 :(得分:1)
在tableView(_:didSelectRowAt:)
中,当您调用performSegue(withIdentifier: sender:)
时,可以传递任何数据或引用。现在可以在prepare(forSegue:sender:)
中使用它了,这是您准备将数据传递给已定购的viewController
的最后一枪。
如果通过情节提要正确连接了segueDetail
,并且用户连续点击,则可以将indexPath
发送到segue,例如:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "segueDetail", sender: indexPath)true)
}
然后在prepare(forSegue:sender:)
中,根据您的解决方案,您可以准备对所需数据的访问,这些数据将传递给下一个viewController
,例如:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? DetailViewController {
let indexPath = sender as! IndexPath
let cell = tableView.cellForRow(at: indexPath) as! PostCell
vc.getImage = cell.postImageView.image
}
}
如果您不使用segue且用户点击了一行,则可以手动推送viewController
并输入以下数据:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
let cell = tableView.cellForRow(at: indexPath) as! PostCell
vc.getImage = cell.postImageView.image
self.navigationController?.pushViewController(desVC, animated: true)
}
您的DetailViewController
应该是:
class DetailViewController: UIViewController {
var getImage: UIImage?
//...
注意:这个答案是我最适合使用给定内容的答案。
它应该可以正常工作,但请不要只是复制粘贴,因为它没有经过优化(例如,用户在下载图像之前先点击一个单元格)。
这只是为了展示基础知识,因此请即兴使用适当的案件处理程序。