将 UIImage 从 UITableViewCell 传递到下一个 ViewController
pass UIimage from UITableViewCell to next ViewController
还有许多其他主题将数据传递给另一个 ViewController - 我知道 - 但我找不到将数据从 UITableViewCell 传递到 [=32] 的解决方案=]UIViewController。这个问题与其他问题不同,这里我必须访问另一个 class 的 UITableViewCell 中的 ImageView。 Segues,为segues做准备其他主题在其他帖子中已充分讨论但不是这个特殊的星座。
我有一个 class 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 中,我这样做是为了转到详细信息ViewController:
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)
详情ViewController:
class DetailViewController: UIViewController {
var getImage = UIImage()
...
我在 xcode 中进行了转接(转接详细信息):
目前我将图像数据存储在 UserDefaults 中,并在 DetailViewController 中再次读取它们。很奇怪,我知道。
我必须从哪里传递数据?在我的 PostCell 或 ViewController 中?问题是在我的 ViewController.
中从 PostCell 访问图像数据
在tableView(_:didSelectRowAt:)
中调用performSegue(withIdentifier: sender:)
时,可以传递其中的任何数据或引用。这现在在 prepare(forSegue:sender:)
中可用,您最后一次准备要传递给 segued 的数据 viewController
。
示例(使用 Segue):
如果 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):
如果您没有使用 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?
//...
注意:这个答案是我能适应给定内容的最佳答案。
它应该可以正常工作,但请不要只是复制粘贴,因为它没有优化(例如,您的用户在下载图像之前点击单元格)。
这只是为了展示基础知识,所以请即兴创作并应用适当的案例处理。
还有许多其他主题将数据传递给另一个 ViewController - 我知道 - 但我找不到将数据从 UITableViewCell 传递到 [=32] 的解决方案=]UIViewController。这个问题与其他问题不同,这里我必须访问另一个 class 的 UITableViewCell 中的 ImageView。 Segues,为segues做准备其他主题在其他帖子中已充分讨论但不是这个特殊的星座。
我有一个 class 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 中,我这样做是为了转到详细信息ViewController:
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)
详情ViewController:
class DetailViewController: UIViewController {
var getImage = UIImage()
...
我在 xcode 中进行了转接(转接详细信息):
目前我将图像数据存储在 UserDefaults 中,并在 DetailViewController 中再次读取它们。很奇怪,我知道。
我必须从哪里传递数据?在我的 PostCell 或 ViewController 中?问题是在我的 ViewController.
中从 PostCell 访问图像数据在tableView(_:didSelectRowAt:)
中调用performSegue(withIdentifier: sender:)
时,可以传递其中的任何数据或引用。这现在在 prepare(forSegue:sender:)
中可用,您最后一次准备要传递给 segued 的数据 viewController
。
示例(使用 Segue):
如果 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):
如果您没有使用 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?
//...
注意:这个答案是我能适应给定内容的最佳答案。
它应该可以正常工作,但请不要只是复制粘贴,因为它没有优化(例如,您的用户在下载图像之前点击单元格)。
这只是为了展示基础知识,所以请即兴创作并应用适当的案例处理。