Get cell index from tableviewcell

百般思念 提交于 2019-12-25 08:17:56

问题


Hey I have this tableview controller that list restaurants from my database. what I want to do is if the cell/row is selected it opens a more detail page about the restaurant. for some reason I can't retrieve the index or its not going to the func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) to give me index here is what I have:

class HomeTableViewController: UITableViewController{


var restaurantArray = [Restaurant]()
var resTransfer: Restaurant?
var resName: String?



var dataBaseRef: FIRDatabaseReference! {
    return FIRDatabase.database().reference()
}


override func viewDidLoad() {
    super.viewDidLoad()
    title = "Home"
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Main Menu", style: .plain, target: self, action: #selector(SSASideMenu.presentLeftMenuViewController))
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    fetchRestaurants()
}

func fetchRestaurants(){
    FIRDatabase.database().reference().child("AthensRestaurants/Restaurants").observe(.value, with: { (snapshot) in
        var results = [Restaurant]()

        for res in snapshot.children{
            let res = Restaurant(snapshot: res as! FIRDataSnapshot)
            results.append(res)
        }

        self.restaurantArray = results.sorted(by: { (u1, u2) -> Bool in
            u1.name < u2.name
        })
        self.tableView.reloadData()

}) { (error) in
print(error.localizedDescription)
}
}

// MARK: - Table view data source
// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return restaurantArray.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "restaurantsCell", for: indexPath) as! RestaurantsTableViewCell

    // Configure the cell...

    cell.configureCell(res: restaurantArray[indexPath.row])

    return cell
}




func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    print("Row \(indexPath.row)selected")
    resTransfer = restaurantArray[indexPath.row]
    resName = restaurantArray[indexPath.row].name
    print(resName as Any)
    performSegue(withIdentifier: "RestaurantDetailView", sender: self)
   }







override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if(segue.identifier == "RestaurantDetailView") {
      let vc = segue.destination as! RestaurantDetailViewController
       vc.resNam = restaurantArray.first?.name //instead of first should be index of cell! 
        print(vc.resNam! as String)
    }
}   
}

回答1:


I am doing it like this, without segue:

func showRestaurantViewControllerWith(_ id: String) {
    let storyBoard = UIStoryboard(name: "RestaurantCard", bundle: nil)
    let destinationVC = storyBoard.instantiateViewController(withIdentifier: "RestaurantCard") as! RestaurantCardViewController
    destinationVC.restaurant.id = id
    self.navigationController?.pushViewController(destinationVC, animated: true)
}

and

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.showRestaurantViewControllerWith(self.allRestaurants[indexPath.row].id)
}



回答2:


You have to use this function to fetch the index

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{           
           print(indexPath.row)        
}

It will give you the index.




回答3:


First of all your code is obviously Swift 3 so the signature of didSelectRowAt is wrong.

Another solution is to pass the indexpath as sender

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("Row \(indexPath.row)selected")
    performSegue(withIdentifier: "RestaurantDetailView", sender: indexPath)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if segue.identifier == "RestaurantDetailView" {
      let indexPath = sender as! IndexPath
      let restaurant = restaurantArray[indexPath.row]
      let resName = restaurant.name
      print(resName!)
      let vc = segue.destination as! RestaurantDetailViewController
      vc.resNam = resName  
   }
}

or still easier to connect the segue to the table view cell. Then you can delete didSelectRow... because prepare(for is called directly and the cell is passed as the sender parameter.

PS: Why is the property name optional? In real life have you ever heard about a restaurant without a name?



来源:https://stackoverflow.com/questions/41409535/get-cell-index-from-tableviewcell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!