2017-02-07 2 views
0

Я создал tableView ячейки с действием, и мне нужно действие, чтобы знать indexPath ячейки, которая выбрана. Я не могу понять, как передать indexPath в качестве параметра для действия или найти любой другой способ его действия. Вот код для Tableview cellForRowAt и действия должны быть выполнены:Передача параметров в действия в Swift

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "menuCell", for: indexPath) as! CustomCell 
    cell.foodName.text = self.menuItems[indexPath.row] 
    //adding gesture recognizer with action Tap to cell 
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(Tap(gesture:index:IndexPath.row))) 
    cell.addGestureRecognizer(tapGesture) 
    return cell 
} 

func Tap(gesture: UIGestureRecognizer , index: Int){ 
    print("Tap") 
    //necessary so that the page does not open twice 
    //adding the rating view 
    let ratingVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "rating") as! RatingView 
    ratingVC.foodName = selectedItem 
    self.addChildViewController(ratingVC) 
    ratingVC.view.frame = self.view.frame 
    self.view.addSubview(ratingVC.view) 
    ratingVC.didMove(toParentViewController: self) 
} 

Я не могу понять, как передать IndexPath.row в качестве параметра Tap.

+0

Если вы предоставили возможность выбора только одной строки в таблицеView, вы можете использовать свойство indexPathForSelectedRow' в 'Fund Tap', чтобы получить индекс indexPath текущей выбранной строки. Для получения дополнительной информации о собственности, проверьте [Apple Doc] (https://developer.apple.com/reference/uikit/uitableview/1615000-indexpathforselectedrow) –

ответ

0

Вам не нужно выполнять функции выбора ячейки, UITableViewDelegate уже имеет такое поведение.

сообразуясь с UITableViewDelegate и реализации tableView(_:didSelectRowAt:) метод, вы сможете получить indexPath.row для выбранной ячейки:

Сообщает делегат, что указанная строка теперь выбранный

Итак, после внедрения tableView(_:didSelectRowAt:) вам следует избавиться от функциональности tapGesture, он должен быть похож на:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "menuCell", for: indexPath) as! CustomCell 
    cell.foodName.text = self.menuItems[indexPath.row] 

    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    print("Selected row: \(indexPath.row)") 
} 
+0

У меня есть эта функциональность в другом месте класса. Проблема в том, что я пытаюсь открыть отдельную страницу, когда ячейка прослушивается, и содержимое этой страницы зависит от того, какая ячейка используется. –

+0

Вы можете реализовать это внутри метода tableView (_: didSelectRowAt:) ', я предполагаю, что вы распознаете выбранную ячейку на основе того, что является indexPath.row –

+0

Спасибо, что это функциональность, которую я искал! Не могу поверить, что я не думал об этом –

0

Использование метода didSelectRowAt Indexpath.

Для пользовательских Tap используйте следующие шаги.

  1. Назначить ярлык вашей ячейке.

    пусть tapGesture = UITapGestureRecognizer (цель: самость, действие: #selector (self.tapBlurButton (_ :)))

    cell.tag = indexPath.row 
    cell.addGestureRecognizer(tapGesture) 
    

2.Manage водопроводная событие

func tapBlurButton(_ sender: UITapGestureRecognizer) { 
    //Get indexpath.row value or Indexpath Value 
print(sender.view.tag) 

} 

Надежда помогает. :)

0

Во-первых, удалите жест отвода. Во-вторых реализации didSelectRow делегат tableView как это:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
//add your rating view code here 
let ratingVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "rating") as! RatingView 
ratingVC.foodName = self.menuItems[indexPath.row] //get the selected item 
self.addChildViewController(ratingVC) 
ratingVC.view.frame = self.view.frame 
self.view.addSubview(ratingVC.view) 
ratingVC.didMove(toParentViewController: self) 

}

Конечно, вы хотите добавить чеки и охранников, чтобы убедиться, что вы ловите ошибки.