Доступ к выбранной секции ячейки в функции делегата в swift - PullRequest
0 голосов
/ 15 мая 2018

Я получаю данные из службы API, которые я передаю в мое табличное представление и создаю раздел и ячейку под ним. Количество разделов и ячеек являются динамическими, зависит от данных, поступающих от службы. У меня есть кнопка на моей камере. Название кнопки добавить. Когда я нажимаю кнопку добавления, отображаются предупреждения, содержащие представление таблицы. Это табличное представление в предупреждении показывает только те данные, которые относятся к этой конкретной ячейке в ее разделе. Я создал метод делегата для кнопки, в котором я получаю indexPath.row этой выбранной кнопки и передаю данные из моей модели в табличное представление внутри оповещения. Когда я нажимаю первую кнопку добавления ячейки, все хорошо, но когда я нажимаю кнопку добавления из раздела 2, происходит обналичивание. То, что я заметил, что приложение падает, потому что компилятор получает только indexPath.row, но не получает информацию о том, в каком разделе находится эта ячейка. Как я могу узнать мою функцию делегата о том, какая ячейка раздела выделяется при нажатии кнопки добавления. Это мой код для функции делегата в моем классе ячеек,

protocol ResMenuDetailDelegate {
func addOnBtnTapped(tappedIndex : Int)
}

 var delegate: ResMenuDetailDelegate?

 @IBAction func addBtnTapped(_ sender: Any) {
    delegate?.addOnBtnTapped(tappedIndex: addBtn.tag)
}

В моем классе контроллера представления здесь я соответствую методу делегата,

extension RestaurantMenuDetailVC : ResMenuDetailDelegate{
func addOnBtnTapped(tappedIndex: Int) {

    print(tappedIndex)

    let addonCategory = subCategoryModel![tappedIndex].items[tappedIndex].addonCategory
  print(addonCategory as Any)
}

Это мой делегат представления таблицы cellForRow,

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if tableView == resMenuTableView{

        let cell = resMenuTableView.dequeueReusableCell(withIdentifier: "detailMenuCell", for: indexPath) as! RestaurantMenuDetailTVC

        cell.dishTitleLbl.text = subCategoryModel![indexPath.section].items[indexPath.row].itemName
        cell.descriptionLbl.text = subCategoryModel![indexPath.section].items[indexPath.row].itemDescription
        cell.priceLbl.text = String(subCategoryModel![indexPath.section].items[indexPath.row].itemPrice)
        cell.addBtn.tag = indexPath.row
        cell.delegate = self
        cell.selectionStyle = .none
        cell.backgroundColor = UIColor.clear
        return cell

    }

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Вам нужно отправить indexpath, сбой, потому что вы получаете доступ к разделу модели массива со значением строки, которое превышает его

func addOnBtnTapped(tappedIndex : IndexPath)

//

extension RestaurantMenuDetailVC : ResMenuDetailDelegate{
 func addOnBtnTapped(tappedIndex: IndexPath) {

   print(tappedIndex)

   let addonCategory = subCategoryModel![tappedIndex.section].items[tappedIndex.row].addonCategory
 print(addonCategory as Any)
}

//

 @IBAction func addBtnTapped(_ sender: Any) {
   delegate?.addOnBtnTapped(tappedIndex:self.myIndexPath)
}

//

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

if tableView == resMenuTableView{

    let cell = resMenuTableView.dequeueReusableCell(withIdentifier: "detailMenuCell", for: indexPath) as! RestaurantMenuDetailTVC

    cell.myIndexPath = indexPath 
 }

//

и объявить эту переменную в ячейке

var myIndexPath:IndexPath!
0 голосов
/ 15 мая 2018

Измените протокол таким образом, чтобы вы могли иметь как значения для строки, так и для раздела.

    protocol ResMenuDetailDelegate {
    func addOnBtnTapped(tappedIndexRow: Int,tappedIndexSection: Int )
    }
    var delegate: ResMenuDetailDelegate?

 @IBAction func addBtnTapped(_ sender: Any) {
    delegate?.addOnBtnTapped(tappedIndexRow: addBtn.tag,tappedIndexSection: section )
}

Здесь вы можете получить метод делегата tableView value для ячейки cellForRowAt,Добавьте переменную в свою ячейку для секции

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        ...
        ...
        cell.addBtn.tag = indexPath.row
        cell.section = indexPath.section
        ...
        ...
    }
0 голосов
/ 15 мая 2018

Я думаю, вы должны передать два параметра в протоколе.

protocol ResMenuDetailDelegate {
func addOnBtnTapped(tappedIndex : Int, button: UIButton)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...