Как получить доступ к значению контроллера представления в tableview внутри tableview в Swift

#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
     
   }
}