Удаление элементов из массива в пользовательском tableViewCell - PullRequest
0 голосов
/ 01 июля 2019

У меня есть пользовательский tableviewHeaderFooterView, где я настраиваю целевое событие для кнопки в пользовательском классе tableViewCell (checkButton - кнопка, и ее фоновое изображение меняется на галочку, когда пользователь нажимает на нее).

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let userModel = Data.userModels[section]
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId") as! SectionHeader

    cell.setup(model: userModel)
    cell.checkButton.tag = section
    cell.checkButton.addTarget(self, action: #selector(handleTap), for: .touchUpInside) 

    return cell.contentView
}

И в этой функции я хочу создавать или удалять элементы из массива в зависимости от того, нажимает ли пользователь на ячейку или нет (то есть, если он нажимает на кнопку, то добавляет что-то в массив, но если он нажимает на это снова, затем удалите этот объект из массива.)

@objc func handleTap(sender: UIButton) {
    sender.isSelected = !sender.isSelected

    if sender.isSelected == true {
        let model = ItemModel(itemName: item, price: price)
        ItemModelFunctions.createItem(for: sender.tag, using: model)
    }
    if sender.isSelected == false {
        ItemModelFunctions.removeFromUser(from: sender.tag)
    }
    print(sender.tag)
}

Вот функции createItem и removeFromUser:

  struct ItemModelFunctions {
    static func createItem(for userIndex: Int, using itemModel: ItemModel) {
        Data.userModels[userIndex].itemModels.append(itemModel)

    }
    static func removeFromUser(from userIndex: Int) {
        Data.itemModels.remove(at: userIndex)
    }
}

Когда я дважды нажимаю на кнопку, чтобы удалить ее из массива, я получаю сообщение о том, что Data.itemModels.remove(at: userIndex) находится вне диапазона.

Я знаю, что использование прототипа ячейки для tableViewHeaderFooterView не совсем корректно, но я видел, как другие программисты и YouTubers добились этого с успехом. Мои проблемы связаны с использованием прототипа клетки? Или я удаляю элемент из массива неправильно? Спасибо всем за помощь!

Ответы [ 3 ]

1 голос
/ 01 июля 2019

Решение Тхань Ву работает.Другим решением было бы добавить IBAction к вашему ViewController:

@IBAction func buttonTapped(_ sender: UIButton) {
    sender.isSelected = !sender.isSelected
    let cell = sender.superview?.superview as! SectionHeader
    if let indexPath = mainTableView.indexPath(for: cell) {
        // if sender.isSelected etc...
    }
}
1 голос
/ 01 июля 2019
   // Please maintain one more array i.e selectedIndexArray and follow below code.

     var  selectedIndexArray  = [Integer]()

        @IBAction func buttonTapped(_ sender: UIButton) {

            let button = sender
            if selectedIndexArray.contains(button.tag) {
                button.tag --> Remove this tag from  selectedIndexArray
                let model = ItemModel(itemName: item, price: price)
                ItemModelFunctions.createItem(for: sender.tag, using: model)
            } else
            {
                selectedIndexArray.append(button.tag)
                ItemModelFunctions.removeFromUser(from: sender.tag)
            }
            //reload tableview.
self.tableView.reloadData()
        }
1 голос
/ 01 июля 2019

Функция checkButton.addTarget будет запускаться при каждом повторном использовании заголовка раздела.Затем он будет дублировать событие для ячейки при многократном использовании.Я думаю, что вы не должны использовать это решение.Вместо этого, я думаю, вы должны написать делегатский способ решения вашей проблемы.Пример:

protocol SectionHeaderDelegate: class {
    func checkButtonDidTap(section: SectionHeader)
}

class SectionHeader: UITableViewCell {
    weak var delegate: SectionHeaderDelegate
    @IBOutlet weak var checkButton: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()

        checkButton.addTarget(self, action: #selector(handleTap), for: .touchUpInside) 
    }

    func handleTap() {
        self.delegate.checkButtonDidTap(section: self)
    }
}

и вы устанавливаете cell.delegate = self в функции viewForHeaderInSection.И реализовать протокол SectionHeaderDelegate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...