切换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) }
额外优化建议
移除DetailViewController中不必要的局部变量:
在你的viewDidLoad里,你重新定义了var rowNumber = Int(),这会覆盖类的全局rowNumber变量,建议删除这行代码。处理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
相关产品推荐
相关产品推荐

