You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换ViewController时result变量意外重置为0,如何修复?

问题分析与修复方案

你遇到的问题核心是视图控制器实例混淆,导致你赋值的变量根本没有传递到最终显示的那个控制器上。

错误原因

看你FirstViewController里的didSelectRowAt方法:

// 1. 从Storyboard正确实例化了要展示的DetailViewController
guard let detailViewController = mainStoryBoard.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController else{
    print("couldnt find vc")
    return
}
// 2. 又新建了一个完全无关的DetailViewController实例
let detailVC = DetailViewController()
detailVC.result = indexPath.row
print(detailVC.result)
// 3. 但你present的是第一个没赋值的实例!
self.present(detailViewController, animated: true, completion: nil)

你创建了两个DetailViewController对象:一个是从Storyboard加载的、最终会被展示的detailViewController,另一个是你手动新建的detailVC。你给detailVC的result赋了值,但最后展示的却是没赋值的detailViewController,所以在DetailViewController里result始终是Int类型的默认值0。

修复代码

修改FirstViewController的didSelectRowAt方法,去掉多余的实例创建,直接给从Storyboard加载的控制器赋值:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    let mainStoryBoard = UIStoryboard(name: "Main", bundle: Bundle.main)
    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)
}

额外优化建议

  1. 移除DetailViewController中不必要的局部变量:
    在你的viewDidLoad里,你重新定义了var rowNumber = Int(),这会覆盖类的全局rowNumber变量,建议删除这行代码。

  2. 处理Firebase异步加载的风险:
    你用observe(.childAdded)来监听数据,这个方法会每次有新数据添加时触发,可能导致posts数组还没完全加载就去访问self.posts[self.result],有数组越界的风险。可以改成一次性加载所有数据:

    func loadPosts() {
        Database.database().reference().child("Posts").observeSingleEvent(of: .value) { snapshot in
            self.posts.removeAll() // 先清空旧数据
            for child in snapshot.children {
                guard let childSnapshot = child as? DataSnapshot,
                      let dict = childSnapshot.value as? [String: Any] else {
                    continue
                }
                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)
            }
            // 确保result在合法范围内再更新UI
            guard self.result < self.posts.count else {
                print("Invalid result index")
                return
            }
            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
        }
    }
    

内容的提问来源于stack exchange,提问作者Ansh Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:47:51