【问题标题】:Variable unexpectedly resetting to 0 when View Controller Switched视图控制器切换时变量意外重置为 0
【发布时间】:2020-12-28 00:35:21
【问题描述】:

我在一个名为 DetailViewController 的 ViewController 中有一个名为“results”的变量,它被赋予了一个值,并在 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)



    }
}

但是当我的应用切换到另一个名为 DetailViewController 的 ViewController 时,变量结果总是打印并存储为 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

                
                
            }

        }


    }
    ```

我该如何解决这个问题?我主要希望它在 FirstViewController 中给出的值能够传递到 DetailViewController,但它会一直重置为 0。

【问题讨论】:

  • detailVC.result = indexPath.row self.present(detailViewController, animated: true, completion: nil),仔细看这段代码,你在一个变量上设置了result,但你在present()调用中使用了另一个变量。
  • 那么我必须在self.present(detailViewController, animated:true, completion: nil) 中更改什么?
  • 当然没有,但是您需要在detailViewController 上设置result 而不是在其他变量上。 detailVC 完全不相关,应该删除。
  • 好的,非常感谢您的帮助!

标签: swift xcode variables xcode6 swift5


【解决方案1】:

您将结果变量传递给新实例 detailVC (detailVC.result),而传递变量的正确实例是 detailViewController (detailViewController.result)。

请在您的共享源代码中替换以下内容:

这个

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)

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)

【讨论】:

  • 不鼓励仅使用代码回答,请添加解决方案说明
  • @JoakimDanielson 我希望你现在会快乐..... :)
  • 这只是一个好的答案所期望的,但对你有好处,希望我在这里和上面的 cmets 能帮助你获得一些分数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多