Отправка данных из класса CustomTableView в его родительский View Controller - PullRequest
0 голосов
/ 14 мая 2019

У меня есть View Controller "VCInicio", который имеет TableView в своем View, ячейки для этого TableView имеют формат .xib, у ячеек есть собственный класс с именем "CustomiseTableViewCell", внутри которого у меня есть логика, которая получаети печатать строку (номер телефона) каждый раз, когда я нажимаю на RadioButton, он печатает свой номер телефона, я могу напечатать значение (из класса CustomiseTableViewCell) и увидеть значение на консоли, но мне нужно отправить это значение обратнок "VCInicio", чтобы я мог манипулировать им из этого контроллера.Я видел много примеров, которые предлагают использовать протоколы, но я не смог заставить их работать.

iPhone

РЕДАКТИРОВАТЬ : из-заструктура, которую я использую, я не могу работать с didSelectRowAt , поэтому я работаю с выделением переключателя вместо выделения ячейки.

ЧтоИсправлена ​​ошибка:

" CustomiseTableViewCellDelegate " Настольный класс TableView (дочерний класс)

//Protocol Implementation
protocol CustomiseTableViewCellDelegate {
    func onPhoneNumberClicked(_ cell: CustomiseTableViewCell, phoneNumber: String?)
}

class CustomiseTableViewCell: UITableViewCell {

    var delegate: CustomiseTableViewCellDelegate?
    var phone: String?

    override func awakeFromNib() {
        super.awakeFromNib()
        ...
     }

     //Here I get and send the phoneNumber 
     @objc func radioButtonTapped(_ radioButton: UIButton) {
        ...
        phone = itemLabel.text!
        self.delegate?.onPhoneNumberClicked(self, phoneNumber: phone!)
        ...
    }
}

" VCInicio " Контроллер представления

class VCInicio: UIViewController, UITableViewDelegate, UITableViewDataSource, CustomiseTableViewCellDelegate {
    func onPhoneNumberClicked(_ cell: CustomiseTableViewCell, phoneNumber: String?) {
        //Here I print the phoneNumber
        print("From VCInicio", phoneNumber)
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCell(withIdentifier: "phoneCell", for: indexPath) as! CustomiseTableViewCell
        cell.delegate = self

        ...
        //cell data config 
        ...

        return cell
    }
}

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Этот код ниже прямо сейчас для ImageView с распознавателем жестов. Который нацелен на handleAvatarTap. Который публикует глобальное уведомление. Любой ViewController или View могут прослушивать уведомления, и как только выбранный из них будет опубликован, контроллер может действовать в этом направлении. В приведенном ниже примере приведен пример передачи ImageView в качестве объекта для уведомления.

// this is how I am creating a new notification name type
extension Notification.Name {
    static let didTapAvatar = Notification.Name("didTapAvatar")
}

// this would go within the cell where you are printing the number
     @objc func handleAvatarTap() {
        NotificationCenter.default.post(name: .didTapAvatar, object: self)
    }

// This would go in to the view controller viewDidLoad
NotificationCenter.default.addObserver(self, selector: #selector(handleAvatarTap), name: .didTapAvatar, object: nil)


// This is the objc func within the view controller
 @objc fileprivate func handleAvatarTap(notification: NSNotification) {
        // checking the type of the posted notification object
        guard let avatarView = notification.object as? AvatarView else { return }
}
0 голосов
/ 14 мая 2019

Если вы не хотите использовать пользовательские протоколы:

Предполагая, что числа хранятся в некоторой модели в переменной phoneNumbers: [String]

  1. Сделайте делегат вашего табличного представления VC:
self.tableView.delegate = self
Расширение ViewController для соответствия UITableViewDelegate протоколу
class VCInicio: UIViewController, UITableViewDelegate {

//...

}
Реализация func tableView(UITableView, didSelectRowAt: IndexPath) и использование значения выбранного сотового телефона для последующего управления им
class VCInicio: UIViewController, UITableViewDelegate {

//...

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedPhoneNumber = self.model.phoneNumbers[indexPath.row]
        // manipulate selectedPhoneNumber
    }

}


С протоколами:

  1. Определение делегата ячейки и его использованиев методе для клика
protocol CustomiseTableViewCellDelegate: class {
    func onPhoneNumberClicked(_ cell: CustomiseTableViewCell, phoneNumber: String?)
}

class CustomiseTableViewCell: UITableViewCell {
    weak var delegate: CustomiseTableViewCellDelegate?
    // ... rest of your cell class

   func onPhoneClicked() {
       // this is the function where you have code to print the number to console
      print(self.phoneNumberLabel.text)
      self.delegate?.onPhoneNumberClicked(self, self.phoneNumberLabel.text)
   }

}
В вашем UITableViewDataSource методе создания ячеек укажите VCInicio в качестве делегата ячейки
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   // assuming you have your cell here
   cell.delegate = self

   return cell
}
Настройте ваш VC на CustomiseTableViewCellDelegate протокол
class VCInicio: UIViewController, CustomiseTableViewCellDelegate {

//...

    override func onPhoneNumberClicked(_ cell: CustomiseTableViewCell, phoneNumber: String?) {
        // manipulate phoneNumber
    }

}

...