iOS Swift - 准备segue后属性不更新

时间:2017-01-30 01:58:16

标签: ios swift3 realm segue

我正在尝试将类型为string的新闻ID传递给第二个VC并从Realm加载基于它的对象。当我调试时,我发现准备segue正确地将detailNewsVC.newsID设置为我的新闻项的主键,但第二个VC没有收到它。对此有何帮助?

检查我做了:

  1. 确保详细VC标识符正确
  2. VC 1中的
  3. detailNewsVC.newsID正确设置了新闻ID。这是为了确保领域正确发送新闻ID并且工作正常。
  4. 将VC 2中的viewDidLoad更改为viewWillLoad ..只是为了确保之前没有加载第二个vc,但是没有运气。
  5. 重新启动xcode
  6. 使用实际的新闻主键替换VC 2中的newsID,并正确地提取相关新闻。我认为罪魁祸首是VC2属性:当调用segue准备时,newsID没有更新。
  7. 准备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
    
    }
    
    
    }
    

2 个答案:

答案 0 :(得分:1)

将准备功能移出扩展程序并将其放入HomeVC。根据Apple的Swift Guide扩展无法覆盖现有功能。

  

扩展程序可以为类型添加新功能,但它们无法覆盖现有功能。

Apple Developer 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
    }
}
相关问题