簡體   English   中英

為什么“secim”返回 nil 給這個項目中的其他 ViewController

[英]Why "secim" returns nil to other ViewController in this project

我正在嘗試制作一個應用程序,當您單擊 collectionview 單元格上的按鈕時,您可以顯示詳細視圖控制器並提供有關您的選擇的更多信息。但我的結構的所有屬性在其他 viewController 上顯示為 nil。

這是我的 ViewController,包括 CollectionView

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!
    var ilceDizisi = [Ilceler]()
    var secim : Ilceler?
    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.delegate = self
        collectionView.dataSource = self
        let textAttributes = [NSAttributedString.Key.foregroundColor:UIColor.white, NSAttributedString.Key.font:UIFont(name: "Papyrus", size: 25.0)]
        navigationController?.navigationBar.titleTextAttributes = textAttributes as [NSAttributedString.Key : Any]
        //Hucre Boyurlandirmasi
        let tasarim = UICollectionViewFlowLayout()
        let genislik = self.collectionView.frame.size.width
        tasarim.minimumInteritemSpacing = 5
        tasarim.minimumLineSpacing = 5
        tasarim.sectionInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        tasarim.itemSize = CGSize(width: (genislik - 30) / 2, height: 322.0)
        collectionView.collectionViewLayout = tasarim
        ilceDizisi = [Ilceler.adalar, Ilceler.arnavutkoy, Ilceler.atasehir, Ilceler.avcilar, Ilceler.bagciler, Ilceler.bahcelievler, Ilceler.bakirkoy, Ilceler.basaksehir, Ilceler.bayrampasa, Ilceler.besiktas, Ilceler.beykoz, Ilceler.beylikduzu , Ilceler.beyoglu, Ilceler.buyukcekmece, Ilceler.catalca , Ilceler.cekmekoy , Ilceler.esenler , Ilceler.esenyurt , Ilceler.eyupsultan , Ilceler.fatih , Ilceler.gaziosmanpasa , Ilceler.gungoren , Ilceler.kadikoy , Ilceler.kagithane , Ilceler.kartal, Ilceler.kucukcekmece , Ilceler.maltepe , Ilceler.pendik , Ilceler.sancaktepe , Ilceler.sariyer , Ilceler.sile , Ilceler.sultanbeyli , Ilceler.sultangazi , Ilceler.sile, Ilceler.sisli , Ilceler.tuzla , Ilceler.umraniye , Ilceler.uskudar , Ilceler.zeytinburnu]
  
    }


}



extension ViewController : UICollectionViewDelegate , UICollectionViewDataSource, CellButton {
    
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return ilceDizisi.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "hucre", for: indexPath) as! Cell
        cell.isimLabel.text = ilceDizisi[indexPath.row].isim!
        cell.yakaLabel.text = ilceDizisi[indexPath.row].yaka!
        cell.ilceGorsel.image = UIImage(named: ilceDizisi[indexPath.row].gorsel!)
        cell.prot = self
        cell.indexPath = indexPath
        return cell
    }
    func detail(indexPath: IndexPath) {
        performSegue(withIdentifier: "toDetailVC", sender: nil)
        secim = ilceDizisi[indexPath.row]
        
        
        
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toDetailVC" {
            let destVC = segue.destination as! DetailViewController
            destVC.secilenIlce = secim
        }
    }
    
}

這是我的詳細視圖控制器

import UIKit

class DetailViewController: UIViewController {

    @IBOutlet weak var baskan: UILabel!
    @IBOutlet weak var yuz: UILabel!
    @IBOutlet weak var nufus: UILabel!
    @IBOutlet weak var yaka: UILabel!
    @IBOutlet weak var gorselView: UIImageView!
    @IBOutlet weak var ilceLabel: UILabel!
    var secilenIlce : Ilceler?
    override func viewDidLoad() {
        super.viewDidLoad()
        baskan.text = "Belediye Başkanı : \(secilenIlce?.belediyeBaskani)"
        yuz.text = "Yüzölçümü(km²) : \(secilenIlce?.yuzolcumu)"
        nufus.text = "Nüfus : \(secilenIlce?.nufus)"
        yaka.text = "Bulunduğu Yaka : \(secilenIlce?.yaka)"
        gorselView.image = UIImage(named: (secilenIlce?.gorsel)!)
        ilceLabel.text = secilenIlce?.isim    
    }
}

我想看到這樣的信息

在此處輸入圖像描述

但是當我運行這個項目時

在此處輸入圖像描述

我嘗試使用 prepareforsegue func 獲取所有信息。實際上我需要刪除 imageview.image 代碼,因為它返回 nil,如果我打開它,我的項目會崩潰。我的錯是什么,我該如何解決

您需要在執行 segue 之前設置secim 交換您的detail函數中的兩行。

func detail(indexPath: IndexPath) {
    secim = ilceDizisi[indexPath.row]
    performSegue(withIdentifier: "toDetailVC", sender: nil)
}

使用您的原始代碼,您正在調用performSeque ,這會導致調用prepare 但那時你還沒有設置secim 所以你在調用prepare之后設置secim 最有可能的是,如果您再次點擊一個單元格,它會顯示之前點擊的單元格的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM