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.