Как получить данные ячейки, когда я нажимаю на кнопку, которая находится в viewForFooterInSection в swift

#swift #uitableview #uitableviewsectionheader

#swift #uitableview #uitableviewsectionheader

Вопрос:

Я новичок в swift, и я сталкиваюсь с проблемой, когда я нажимаю на кнопку, которая находится в viewForFooterInSection

мой код выглядит следующим образом

В viewForFooterInSection

     func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
            let footerview = Bundle.main.loadNibNamed("TimeSheetFooterTableViewCell", owner: self, options: nil)?.first as! TimeSheetFooterTableViewCell
            
            let dictFeeStats = arrFinancialYears[section] as? [String:Any]
            footerview.lblTimeSheetFooterID.text = dictFeeStats?["staff_timesheet_id"] as? String            

            footerview.btnAccept.tag = section
            footerview.btnAccept.addTarget(self, action: #selector(btnAcceptClick), for: .touchUpInside)
            
            return footerview
        }
  

При нажатии кнопки

  @objc func btnAcceptClick(_ sender: UIButton)
    {
        let index = IndexPath(row: sender.tag, section: 0)
        let cell: TimeSheetFooterTableViewCell = self.tblview.cellForRow(at: index) as! TimeSheetFooterTableViewCell
        let comment = cell.lblTimeSheetFooterID.text
        
        print("buttonPressed ! (sender.tag)")
    }
  

Как я могу получить значение TimeSheetFooterTableViewCell в переменной комментария.
Заранее спасибо!

Ответ №1:

Вы можете добавить замыкание в TimeSheetFooterTableViewCell , которое принимает строку. При нажатии на кнопку вызовите это закрытие с помощью textview текста.

 var acceptButtonTapped: ((String?) -> ())?

@IBAction func btnAcceptClick(_ sender: UIButton) {
    acceptButtonTapped?(txtview.text)
}
  

В вашем tableView(_ tableView: UITableView, viewForFooterInSection получите текст из обратного вызова.

 footerview.acceptButtonTapped = { text in
    print(text)
}
  

Комментарии:

1. Ваш код не работает, когда я возвращаю return footerview.contentView

2. Почему вы возвращаете footerview.contentview?

3. поскольку в textview просмотр нижнего колонтитула выполнен, просмотр нижнего колонтитула исчез

4. почему она исчезает? что-нибудь еще происходит внутри действия кнопки и viewForFooterInSection метода?

Ответ №2:

Используйте footerView(forSection:) метод вместо cellForRow(at:) .

Заменить:

 let cell: TimeSheetFooterTableViewCell = self.tblview.cellForRow(at: index) as! TimeSheetFooterTableViewCell
  

С:

 let footerView = tblview.footerView(forSection: sender.tag) as! TimeSheetFooterTableViewCell
  

Комментарии:

1. показывает мне эту ошибку. Неправильная метка аргумента в вызове (есть ‘forSection:’, ожидается ‘at:’)

2. Я немного пропустил. Попробуйте еще раз, я только что обновил метод.

3. Приведение из ‘UITableViewHeaderFooterView?’ к несвязанному типу ‘TimeSheetFooterTableViewCell’ всегда завершается неудачей

4. Не могли бы вы, пожалуйста, проверить, что я создал файл .xib для TimeSheetFooterTableViewCell

5. TimeSheetFooterTableViewCell должно быть типа UITableViewHeaderFooterView . Иначе это не сработает. Убедитесь, что class TimeSheetFooterTableViewCell: UITableViewHeaderFooterView {

Ответ №3:

обычно пользовательские взаимодействия помещаются в ячейку. И после нажатия затронутая ячейка информирует tablewView посредством обратных вызовов.

Это код ячейки:

    class TimeSheetFooterTableViewCell: UITableViewCell {
    
    var btnAccept: UIButton!
    var lblTimeSheetFooterID: UITextView!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        btnAccept = UIButton()
        btnAccept.addTarget(self, action: #selector(btnAcceptClick), for: .touchUpInside)
    }
    
    //Callback for communication between cell and tableView
    var btnDidTap: ((String) -> Void)?
    
    @objc func btnAcceptClick(_ sender: UIButton) {
        btnDidTap?(lblTimeSheetFooterID.text ?? "")
    }
    
    

    
}
  

Это функция нижнего колонтитула в делегате TableView:

 func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let footerview = Bundle.main.loadNibNamed("TimeSheetFooterTableViewCell", owner: self, options: nil)?.first as! TimeSheetFooterTableViewCell
    
    let dictFeeStats = arrFinancialYears[section] as? [String: Any]
    
    footerview.btnDidTap = { comment in
        print("section number: (section) DID TAP!")
    }
    
    return footerview
}
  

Комментарии:

1. как я могу получить данные textview при нажатии кнопки?

2. Я обновил ответ. если lblTimeSheetFooterID является вашим UITextField или UILabel, это должно сработать для вас

3. Не работает, этот метод не вызывается при нажатии кнопки footerview.btnDidTap = { комментарий в печати(«номер раздела: (раздел) ДЕЙСТВИТЕЛЬНО НАЖАЛ!»)}

4. Можете ли вы поделиться своим существующим кодом? Я думаю, вы забыли функцию awakeFromNib, как в моем примере.

5. Также ваш TimeSheetFooterTableViewCell должен быть подклассом UITableViewHeaderFooterView. По-другому, это не должно работать