简体   繁体   中英

Variable unexpectedly resetting to 0 when View Controller Switched

I had a variable called "results" in a ViewController called DetailViewController which is given a value, and is printed correctly in FirstViewController:

extension FirstViewController: UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return posts.count
    }
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! PostTableViewCell
        
        cell.typeLabel.text = "Name: \(posts[indexPath.row].typeOfFood)"
        cell.titleLabel.text = "Title: \(posts[indexPath.row].title)"
        cell.locationLabel.text = "Location: \(posts[indexPath.row].location)"
        cell.nameLabel.text = "Name: \(posts[indexPath.row].name)"
        return cell
        
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//        print("Select Row \(indexPath.row)")
        var result = indexPath.row
        tableView.deselectRow(at: indexPath, animated: true)
//        self.performSegue(withIdentifier: "showDetail", sender: nil)
        let mainStoryBoard = UIStoryboard(name: "Main", bundle: Bundle.main)
        guard let detailViewController = mainStoryBoard.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController else{
            print("couldnt find vc")
            return
        }
        let detailVC = DetailViewController()
        detailVC.result = indexPath.row
        print(detailVC.result)
        self.present(detailViewController, animated: true, completion: nil)



    }
}

But then when my app switches to another ViewController called DetailViewController, The variable result is always printed and stored as 0. DetailViewController:

import UIKit
import Firebase
import FirebaseDatabase
class DetailViewController: UIViewController {

    @IBOutlet weak var backButton: UIBarButtonItem!
    @IBOutlet weak var nameOfUserLabel: UILabel!
    @IBOutlet weak var typeOfFoodNeededLabel: UILabel!
    @IBOutlet weak var amountOfFoodNeededLabel: UILabel!
    @IBOutlet weak var reasonNeededLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var locationLabel: UILabel!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var messageButton: UIButton!
     var posts = [Posts]()
    var rowNumber = String()
    var result = Int()
    override func viewDidLoad() {
        super.viewDidLoad()
        var rowNumber = Int()
        loadPosts()
print(result)
//        nameOfUserLabel.text = posts[result].name

    }
    
    func loadPosts() {
        Database.database().reference().child("Posts").observe(.childAdded){(snapshot: DataSnapshot) in
            if let dict = snapshot.value as? [String: Any]{
                
                let titleText = dict["Title"] as! String
                let typeofFoodText = dict["Type of Food"] as! String
                let descriptionText = dict["Description"] as! String
                let amountNeededText = dict["Number of Items Needed"] as! String
                let locationText = dict["Location"] as! String
                let nameText = dict["Name of User"] as! String
                let reasonNeeded = dict["Reason for Donation"] as! String
                
                
                let post = Posts(titleText: titleText, typeOfFoodText: typeofFoodText, descriptionText: descriptionText, amountNeededText: amountNeededText, locationText: locationText, nameText: nameText, reasonNeededText: reasonNeeded)
                 
                self.posts.append(post)
                print(self.posts)

                self.nameOfUserLabel.text = self.posts[self.result].name
                self.descriptionLabel.text = self.posts[self.result].description
                self.typeOfFoodNeededLabel.text = self.posts[self.result].typeOfFood
                self.amountOfFoodNeededLabel.text = self.posts[self.result].amountNeeded
                self.reasonNeededLabel.text = self.posts[self.result].reasonNeeded
                self.locationLabel.text = self.posts[self.result].location

                
                
            }

        }


    }
    ```

How can I fix this? I mainly want the value it is given in FirstViewController to carry over to the DetailViewController, but it keeps resetting back to 0.

You are passing the result variable to the new instance detailVC (detailVC.result) while the right instance for the passed variable is detailViewController (detailViewController.result).

Please replace the following in your shared source code:

This

let mainStoryBoard = UIStoryboard(name: "Main", bundle: Bundle.main)
guard let detailViewController = mainStoryBoard.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController else{
                print("couldnt find vc")
                return
            }
let detailVC = DetailViewController()
detailVC.result = indexPath.row
print(detailVC.result)
self.present(detailViewController, animated: true, completion: nil)

With

let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
    guard let detailViewController = mainStoryBoard.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController else{
                    print("couldnt find vc")
                    return
                }
    detailViewController.result = indexPath.row
    print(detailViewController.result)
    self.present(detailViewController, animated: true, completion: nil)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM