#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. По-другому, это не должно работать