我正在尝试将类型为string的新闻ID传递给第二个VC并从Realm加载基于它的对象。当我调试时,我发现准备segue正确地将detailNewsVC.newsID设置为我的新闻项的主键,但第二个VC没有收到它。对此有何帮助?
检查我做了:
准备segue的第一个VC代码:
extension HomeVC: UICollectionViewDelegate {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == SegueIdentifier.gotodetail.rawValue, let sendNewsID = sender as? String {
let navVC = segue.destination as? UINavigationController
let detailNewsVC = navVC?.viewControllers.first as! DetailNewsVC
detailNewsVC.newsID = sendNewsID
print("Detail News ID = \(detailNewsVC.newsID)")
}
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let newsID = newsArray[indexPath.row].newsId
performSegue(withIdentifier: SegueIdentifier.gotodetail.rawValue, sender: newsID)
}
}
第二个VC代码:
class DetailNewsVC: UIViewController {
@IBOutlet private weak var scrollView: UIScrollView!
@IBOutlet private weak var newsTitle: UILabel!
@IBOutlet private weak var newsImage: UIImageView!
@IBOutlet private weak var newsDescription: UILabel!
var newsID = ""
override func viewDidLoad() {
super.viewDidLoad()
let realm = try! Realm()
print("News ID: \(newsID)")
guard let news = realm.object(ofType: News.self, forPrimaryKey: newsID as AnyObject) else {
print("Cannot load news")
return
}
print(news)
newsTitle.text = news.newsTitle
if let url = URL(string: news.urlToImage), let data = try? Data.init(contentsOf: url) {
newsImage.image = UIImage(data: data)
}
newsDescription.text = news.newsDescription
}
}
答案 0 :(得分:1)
将准备功能移出扩展程序并将其放入HomeVC。根据Apple的Swift Guide扩展无法覆盖现有功能。
扩展程序可以为类型添加新功能,但它们无法覆盖现有功能。
答案 1 :(得分:0)
很难说出UIKit调用UIViewController
方法的顺序,但是在你有机会设置viewDidLoad
的值之前,可能会调用newsID
。 1}}。
以下内容可能有些过分,但它会保证在viewDidLoad
期间更新观看次数,或者在事后设置newsID
后更新:
class DetailNewsVC: UIViewController {
@IBOutlet private weak var scrollView: UIScrollView!
@IBOutlet private weak var newsTitle: UILabel!
@IBOutlet private weak var newsImage: UIImageView!
@IBOutlet private weak var newsDescription: UILabel!
public var newsID = "" {
didSet {
updateUIForNews()
}
}
override func viewDidLoad() {
super.viewDidLoad()
updateUIForNews()
}
private func updateUIForNews() {
guard !newsID.isEmpty else {
return
}
let realm = try! Realm()
print("News ID: \(newsID)")
guard let news = realm.object(ofType: News.self, forPrimaryKey: newsID as AnyObject) else {
print("Cannot load news")
return
}
print(news)
newsTitle.text = news.newsTitle
if let url = URL(string: news.urlToImage), let data = try? Data.init(contentsOf: url) {
newsImage.image = UIImage(data: data)
}
newsDescription.text = news.newsDescription
}
}