मैं एक फ़ंक्शन कार्यान्वित कर रहा हूं जो डेटा तालिका सेल पर क्लिक करते समय सेल के शीर्षक को अगले नियंत्रक के JSON फ़ाइल नाम पर भेजता है।

डेटा अच्छी तरह से गुजरता है, लेकिन डेटा एक के बाद एक देर से आता है। यदि आप पहली सेल पर क्लिक करते हैं, तो डेटा नहीं जाता है, और यदि आप दूसरे सेल पर क्लिक करते हैं, तो पहले सेल की सामग्री स्थानांतरित हो जाती है।

मैं देर से आने वाले डेटा को एक-एक करके कहाँ समायोजित करूँ? कोई विचार?

वीसी1

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        guard let nextViewController: SecondViewController = segue.destination as? SecondViewController else {
            return
        }
        guard let cell: UITableViewCell = sender as? UITableViewCell else {
            return
        }
        nextViewController.title = cell.textLabel?.text
        nextViewController.secondAssetName = jsonName
    }


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let country: Countries = countries[indexPath.row]
        jsonName = country.asset_name
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return countries.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MainCell", for: indexPath)
        let country: Countries = countries[indexPath.row]
        cell.imageView?.image = UIImage(named: "flag_" + country.asset_name)
        cell.textLabel?.text = country.korean_name
        return cell
    }
    
    // Data Transfer
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        guard let nextViewController: SecondViewController = segue.destination as? SecondViewController else {
            return
        }
        guard let cell: UITableViewCell = sender as? UITableViewCell else {
            return
        }
        nextViewController.title = cell.textLabel?.text
        nextViewController.secondAssetName = jsonName
    }
}

वीसी2

class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var weathers = [Weather]()
    var secondAssetName: String?
    
    @IBOutlet weak var tableView: UITableView!
    
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        let jsonDecoder = JSONDecoder()
        guard let dataAsset = NSDataAsset(name: secondAssetName ?? "") else {
            return
        }
        do {
            weathers = try jsonDecoder.decode([Weather].self, from: dataAsset.data)
        } catch {
            print(error.localizedDescription)
        }
        tableView.reloadData()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.tableView.delegate = self
        self.tableView.dataSource = self
    }
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return weathers.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: CustomTableViewCell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomTableViewCell
        let weather: Weather = weathers[indexPath.row]
        
        switch weather.state {
        case 10:
            cell.cellImageView?.image = UIImage(named: "sunny.png")
        case 11:
            cell.cellImageView?.image = UIImage(named: "cloudy.png")
        case 12:
            cell.cellImageView?.image = UIImage(named: "rainy.png")
        case 13:
            cell.cellImageView?.image = UIImage(named: "snowy.png")
        default:
            return cell
        }
        cell.cityNameLabel.text = weather.city_name
        cell.temperatureLabel.text = String(weather.celsius)
        cell.rainfallProbabilityLabel.text = String(weather.rainfall_probability)
        return cell
    }
}
ios
0
Hyunwoo 26 अगस्त 2020, 12:26

1 उत्तर

सबसे बढ़िया उत्तर

अपने कोड में ब्रेकप्वाइंट जोड़ें। आपको देखना चाहिए कि समस्या कहां है। prepare(for: sender:) को tableView(_: didSelectRowAt:) से पहले कॉल किया जा रहा है, इसलिए जब आप पहली बार किसी सेल को टैप करते हैं, तो prepare के दौरान jsonName शून्य होता है, फिर वह didSelect के दौरान सेट हो जाता है। दूसरी बार जब आप इसे टैप करते हैं, jsonName में पहले टैप से मान होता है, उसके बाद यह अपडेट हो जाता है।

अपने सारे लॉजिक को एक जगह रखें। didSelect विधि निकालें, और prepare को इस प्रकार अपडेट करें:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        guard let nextViewController: SecondViewController = segue.destination as? SecondViewController else {
            return
        }
        guard let cell: UITableViewCell = sender as? UITableViewCell else {
            return
        }
        guard let indexPath = tableView.indexPath(for: cell) else {
            return
        }

        let country: Countries = countries[indexPath.row]
        nextViewController.title = country.korean_name
        nextViewController.secondAssetName = country.asset_name
    }
1
jrturton 26 अगस्त 2020, 09:45