#ios #swift #uitableview
#iOS #swift #uitableview
Вопрос:
Я новичок в Swift, и я не могу получить доступ к переменной IBOutlet в ячейке tableview внутри ячейки tableview.
Мой код выглядит примерно так.
В контроллере представления:
@IBOutlet var lblPopupTitle: UILabel!
В Tableview внутри ячейки:
cell.btnEdit.tag = indexPath.item
cell.btnEdit.addTarget(self, action: #selector(btnEdit), for: .touchUpInside)
В ячейке Tableview:
class AttendanceInOutCell: UITableViewCell {
@IBOutlet var txtStartAt: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
}
@objc func btnEditClick(_ sender: UIButton)
{
let index = IndexPath(row: sender.tag, section: 0)
let cell: AttendanceInsideCell = tableAway.cellForRow(at: index) as! AttendanceInsideCell
lblPopupTitle.text = cell.txtAwayStart.text
}
}
lblPopupTitle покажите мне «Использование неразрешенного идентификатора ‘lblPopupTitle'». Как я могу решить эту проблему?
Ответ №1:
Для этого есть несколько способов.
Подход с делегированием протокола:
protocol PassDataDelagate: class {
func passtextFieldText(_ startText: String)
}
Создайте протокол в классе:
AttendanceInOutCell: UITableViewCell {
@IBOutlet var txtStartAt: UITextField!
weak var textDelegate: PassDataDelagate?
override func awakeFromNib() {
super.awakeFromNib()
}
@objc func btnEditClick(_ sender: UIButton)
{
let index = IndexPath(row: sender.tag, section: 0)
let cell: AttendanceInsideCell = tableAway.cellForRow(at: index) as! AttendanceInsideCell
textDelegate?.passtextFieldText(cell.txtAwayStart.text)
}
}
Внутри ячейки Tableview добавьте эту строку:
cell.btnEdit.tag = indexPath.item
cell.textDelegate = self
cell.btnEdit.addTarget(self, action: #selector(btnEdit), for: .touchUpInside)
Добавьте это в контроллер представления:
func passtextFieldText(_ startText: String) {
lblPopupTitle.text = startText
}
P.S: Вы также можете передать несколько сведений в функции делегирования, если хотите.
Комментарии:
1. функция passtextFieldText не получает вызова, и если я напишу cell.textDelegate = self, она показывает мне значение ошибки типа ‘insideTableviewCell’ не имеет элемента ‘textDelegate’
2. Добавьте подобное расширение Your_ViewController_Name: PassDataDelagate { функция passtextFieldText(_ startText: String) { lblPopupTitle.text = startText } }
Ответ №2:
protocol AttendanceDelegate: class {
func didTapOnBtn(_ popUpTitle: String)
}
class AttendanceInOutCell: UITableViewCell {
@IBOutlet var txtStartAt: UITextField!
weak var delegate: AttendanceDelegate?
override func awakeFromNib() {
super.awakeFromNib()
}
@objc func btnEditClick(_ sender: UIButton)
{
let index = IndexPath(row: sender.tag, section: 0)
let cell: AttendanceInsideCell = tableAway.cellForRow(at: index) as! AttendanceInsideCell //( I'm not getting this from where you get this tableAway variable) // So I m just telling you how you can set lblpopupTitle.text in viewController
lblPopupTitle.text = cell.txtAwayStart.text // remove this line
self.delegate.didTapOnBtn(cell.txtAwayStart.text) // please unwrap the textfield text before passing it as parameter
}
}
// for view controller
// there must be as tableview cellforRowAt function where you are creating your cell
// so after creating the cell instance
// add this line ( cell.delegate = self) and return cell
// now add extension to your controller
extension ViewController: AttendanceDelegate {
func didTapOnBtn(_ popUpTitle: String) {
lblPopupTitle.text = popUpTitle
}
}