将 UIImage 推送到 swift 中的下一个视图控制器
Pushing UIImage to next view controller in swift
我已成功将图像解析为 cellForRowAt
,但现在需要为 ResultsViewController
中的食谱显示它 didSelectRowAt
,但遇到了麻烦。
RecipeTableViewController.swift
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! RecipeTableViewCell
if let item = tableViewDataSource[indexPath.item] as? Recipe {
if isSearching {
cell.item = filteredData[indexPath.row]
cell.recipeImage.downloadImage(from: (self.filteredData[indexPath.item].image))
} else {
cell.item = item
cell.recipeImage.downloadImage(from: (self.tableViewDataSource[indexPath.item].image))
}
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let Storyboard = UIStoryboard(name: "Main", bundle: nil)
let resultsVC = Storyboard.instantiateViewController(withIdentifier: "ResultsViewController") as! ResultsViewController
// Information to be passed to ResultsViewController
if (tableViewDataSource[indexPath.item] as? Recipe) != nil {
if isSearching {
resultsVC.getTitle = filteredData[indexPath.row].title
resultsVC.getIngredients = filteredData[indexPath.row].ingredients
// Parse Image
} else {
resultsVC.getTitle = tableViewDataSource[indexPath.row].title
resultsVC.getIngredients = tableViewDataSource[indexPath.row].ingredients
// Parse Image
//resultsVC.getImage = resultsVC.imageDisplay.downloadImage(from (self.tableViewDataSource[indexPath.item].image))
}
}
// Push to next view
self.navigationController?.pushViewController(resultsVC, animated: true)
}
extension UIImageView {
func downloadImage(from url: String) {
let urlRequest = URLRequest(url: URL(string: url)!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
if error != nil {
print(error!)
return
}
DispatchQueue.main.sync {
self.image = UIImage(data: data!)
}
}
task.resume()
}
}
ResultsViewController.swift
class ResultsViewController: UIViewController {
var getTitle = String()
var getIngredients = String()
var getImage = String()
@IBOutlet weak var recipeDisplay: UILabel!
@IBOutlet weak var ingredientsDisplay: UITextView!
@IBOutlet weak var imageDisplay: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
recipeDisplay.text! = getTitle
ingredientsDisplay.text! = getIngredients
imageDisplay.image! = getImage
}
...
}
我可以在 cellForRowAt
中调用 downloadImage
函数,但无法找到将该图像推送到下一个视图控制器的方法。 didSelectRowAt
中有注释代码,其中 returns 错误:
"Cannot assign value of type '()' to type 'UIImage'"
感谢帮助。
将didSelectRowAt
替换为下面的
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let Storyboard = UIStoryboard(name: "Main", bundle: nil)
let resultsVC = Storyboard.instantiateViewController(withIdentifier: "ResultsViewController") as! ResultsViewController
// Information to be passed to ResultsViewController
if (tableViewDataSource[indexPath.item] as? Recipe) != nil {
if isSearching {
resultsVC.getTitle = filteredData[indexPath.row].title
resultsVC.getIngredients = filteredData[indexPath.row].ingredients
// Parse Image
resultsVC.getImage = filteredData[indexPath.item].image
} else {
resultsVC.getTitle = tableViewDataSource[indexPath.row].title
resultsVC.getIngredients = tableViewDataSource[indexPath.row].ingredients
// Parse Image
resultsVC.getImage = self.tableViewDataSource[indexPath.item].image
}
}
// Push to next view
self.navigationController?.pushViewController(resultsVC, animated: true)
}
并像这样更新 ResultsViewController
,
class ResultsViewController: UIViewController {
var getTitle = String()
var getIngredients = String()
var getImage = String()
@IBOutlet weak var recipeDisplay: UILabel!
@IBOutlet weak var ingredientsDisplay: UITextView!
@IBOutlet weak var imageDisplay: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
recipeDisplay.text = getTitle
ingredientsDisplay.text = getIngredients
imageDisplay.downloadImage(from: getImage)
}
...
}
此外,请确保 IBOutlets
在 storyboard
中已连接
我已成功将图像解析为 cellForRowAt
,但现在需要为 ResultsViewController
中的食谱显示它 didSelectRowAt
,但遇到了麻烦。
RecipeTableViewController.swift
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! RecipeTableViewCell
if let item = tableViewDataSource[indexPath.item] as? Recipe {
if isSearching {
cell.item = filteredData[indexPath.row]
cell.recipeImage.downloadImage(from: (self.filteredData[indexPath.item].image))
} else {
cell.item = item
cell.recipeImage.downloadImage(from: (self.tableViewDataSource[indexPath.item].image))
}
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let Storyboard = UIStoryboard(name: "Main", bundle: nil)
let resultsVC = Storyboard.instantiateViewController(withIdentifier: "ResultsViewController") as! ResultsViewController
// Information to be passed to ResultsViewController
if (tableViewDataSource[indexPath.item] as? Recipe) != nil {
if isSearching {
resultsVC.getTitle = filteredData[indexPath.row].title
resultsVC.getIngredients = filteredData[indexPath.row].ingredients
// Parse Image
} else {
resultsVC.getTitle = tableViewDataSource[indexPath.row].title
resultsVC.getIngredients = tableViewDataSource[indexPath.row].ingredients
// Parse Image
//resultsVC.getImage = resultsVC.imageDisplay.downloadImage(from (self.tableViewDataSource[indexPath.item].image))
}
}
// Push to next view
self.navigationController?.pushViewController(resultsVC, animated: true)
}
extension UIImageView {
func downloadImage(from url: String) {
let urlRequest = URLRequest(url: URL(string: url)!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
if error != nil {
print(error!)
return
}
DispatchQueue.main.sync {
self.image = UIImage(data: data!)
}
}
task.resume()
}
}
ResultsViewController.swift
class ResultsViewController: UIViewController {
var getTitle = String()
var getIngredients = String()
var getImage = String()
@IBOutlet weak var recipeDisplay: UILabel!
@IBOutlet weak var ingredientsDisplay: UITextView!
@IBOutlet weak var imageDisplay: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
recipeDisplay.text! = getTitle
ingredientsDisplay.text! = getIngredients
imageDisplay.image! = getImage
}
...
}
我可以在 cellForRowAt
中调用 downloadImage
函数,但无法找到将该图像推送到下一个视图控制器的方法。 didSelectRowAt
中有注释代码,其中 returns 错误:
"Cannot assign value of type '()' to type 'UIImage'"
感谢帮助。
将didSelectRowAt
替换为下面的
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let Storyboard = UIStoryboard(name: "Main", bundle: nil)
let resultsVC = Storyboard.instantiateViewController(withIdentifier: "ResultsViewController") as! ResultsViewController
// Information to be passed to ResultsViewController
if (tableViewDataSource[indexPath.item] as? Recipe) != nil {
if isSearching {
resultsVC.getTitle = filteredData[indexPath.row].title
resultsVC.getIngredients = filteredData[indexPath.row].ingredients
// Parse Image
resultsVC.getImage = filteredData[indexPath.item].image
} else {
resultsVC.getTitle = tableViewDataSource[indexPath.row].title
resultsVC.getIngredients = tableViewDataSource[indexPath.row].ingredients
// Parse Image
resultsVC.getImage = self.tableViewDataSource[indexPath.item].image
}
}
// Push to next view
self.navigationController?.pushViewController(resultsVC, animated: true)
}
并像这样更新 ResultsViewController
,
class ResultsViewController: UIViewController {
var getTitle = String()
var getIngredients = String()
var getImage = String()
@IBOutlet weak var recipeDisplay: UILabel!
@IBOutlet weak var ingredientsDisplay: UITextView!
@IBOutlet weak var imageDisplay: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
recipeDisplay.text = getTitle
ingredientsDisplay.text = getIngredients
imageDisplay.downloadImage(from: getImage)
}
...
}
此外,请确保 IBOutlets
在 storyboard