gpt4 book ai didi

swift - 如何将图像作为变量传递给单独的 View Controller 中的 UIImageView?

转载 作者:行者123 更新时间:2023-11-30 10:55:01 25 4
gpt4 key购买 nike

我正在提取一些 JSON 数据并将其显示在 UITableView (iOS/iPhone 8) 中。它显示每个值的图像、标题和描述。我已经成功地解决了这个问题,但是在将图像拉入单独的 View Controller 时遇到了麻烦。

我的意思是,当点击第一个 View Controller 上的单元格时,另一个 View Controller 将打开以仅显示该单元格中的信息。

我已经能够通过全局变量和 indexPath 访问标题和描述。但由于与字符串冲突,这不适用于图像。

我在下面列出了我对标题和描述字符串成功完成的操作,然后展示了我的建议(当然这不起作用)。

如何获取已加载且位于数组中的图像,以便像我已经拥有的标题和描述一样进行访问,以便在另一个 View Controller 中使用?

格式化 JSON 并收集值的代码:

if let jsonData = myJson as? [String : Any] { // Dictionary
if let myResults = jsonData["articles"] as? [[String : Any]] {
// dump(myResults)

for value in myResults {
if let myTitle = value["title"] as? String {
// print(myTitle)
myNews.displayTitle = myTitle
}

if let myDesc = value["description"] as? String {
myNews.displayDesc = myDesc
}

if let mySrc = value["urlToImage"] as? String {
// print(mySrc)
myNews.src = mySrc
}

self.myTableViewDataSource.append(myNews)
// dump(self.myTableViewDataSource)

// GCD
DispatchQueue.main.async {
self.myTableView.reloadData()
}

}
}
}

我在类之外有两个变量,以便全局使用它们:

var petsIndex = ""
var petsDesc = ""

使用 UITableView 及其单元格的代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let myCell = tableView.dequeueReusableCell(withIdentifier: "reuseCell", for: indexPath)

let myImageView = myCell.viewWithTag(2) as! UIImageView
let myTitleLabel = myCell.viewWithTag(1) as! UILabel

myTitleLabel.text = myTableViewDataSource[indexPath.row].displayTitle

let myURL = myTableViewDataSource[indexPath.row].src
loadImage(url: myURL, to: myImageView)

return myCell
}

我用来将 JSON 值发送到另一个 View Controller 的代码。我通过利用这些全局变量来实现这一点:

// If a cell is selected, view transitions into a different view controller.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
petsIndex = self.myTableViewDataSource[indexPath.row].displayTitle
petsDesc = self.myTableViewDataSource[indexPath.row].displayDesc

// Img needs to go here

myIndex = indexPath.row
performSegue(withIdentifier: "segue", sender: self)

}

这就是我正在做的事情,也许可以解决我的问题。我将字符串转换为 UIImage?UIImageView? 并将其作为数据传递。我将变量留空,并在数据可用时更改它。当单击单元格时就会发生这种情况。然后在第二个 View Controller 内部,我将使用 IBOutlet 作为 UIImageView:

// Variable outside of the class
var petsImg: UIImageView? = nil

petsImg = self.myTableViewDataSource[indexPath.row].src

我现在很困惑。我收到关于图像是字符串并且需要转换的错误。当它被转换时,变量总是返回空或nil。

更新:我刚刚尝试这样做。它可以工作并且不会抛出任何错误。但是,我仍然得到 nil

petsImg = UIImage(命名为:self.myTableViewDataSource[indexPath.row].src)

最佳答案

当您执行 segue 时,您可以拦截该调用,以便准备它所显示的 View Controller 。此时该 Controller 的 View 尚未加载,因此您需要在 PostViewController 内创建属性;您可以为标题、描述和图像创建属性。

但是,将此信息作为 NewsInfo 对象传递会更容易,例如:

struct NewsInfo {
let displayTitle: String
let displayDesc: String
let src: String

var imageURL: URL { return URL(string: src)! }
}

以及一个自定义单元类,它采用 NewsInfo 对象作为参数来填充 socket 。

class NewsInfoTableViewCell: UITableViewCell {        
var newsInfo: NewsInfo? {
didSet {
updateOutlets()
}
}

override func prepareForReuse() {
super.prepareForReuse()
newsInfo = nil
}

private func updateOutlets() {
textLabel?.text = newsInfo?.displayTitle
detailTextLabel?.text = newsInfo?.displayDesc
// loadImage()
}
}

Setup the custom table cell class并在出队后设置 newsInfo 属性。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseCell", for: indexPath) as! NewsInfoTableViewCell
cell.newsInfo = myTableViewDataSource[indexPath.row]
return cell
}

选择单元格后,您可以将其作为发送者传递以执行转场,而不是设置全局变量来填充 viewDidLoad 上的 PostViewController

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) as? NewsInfoTableViewCell {
performSegue(withIdentifier: "segue", sender: cell)
}
}

如果您通过按住 Ctrl 键从原型(prototype)单元拖动到 IB 中的 PostViewController 来替换现有的 Segue,以使该单元成为 Segue 的发送者,则可以删除整个方法。

我们想要这个,因为我们将拦截 Segue 来准备目标 View Controller ,方法是向它传递所选并触发 Segue 的单元格的 NewsInfo 对象。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch (segue.destination) {
case (let controller as PostViewController, let cell as NewsInfoTableViewCell):
controller.newsInfo = cell.newsInfo
default:
break
}
}

与我们将 NewsInfo 对象传递到单元格以填充 socket 的方式类似,您可以对 PostViewController 执行相同的操作。

关于swift - 如何将图像作为变量传递给单独的 View Controller 中的 UIImageView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54056618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com