将数据从CustomTableView类发送到其父级View Controller

时间:2019-05-13 22:18:54

标签: swift uitableview swift-protocols

我有一个视图控制器“ VCInicio”,该视图控制器中有一个TableView,该TableView的单元格为.xib格式,这些单元格有一个自定义类,称为“ CustomiseTableViewCell”,在其中,我有逻辑并在每次单击RadioButton时打印一个字符串(电话号码),它会打印其电话号码,我可以打印该值(来自CustomiseTableViewCell类)并在控制台上查看该值,但我需要将该值发送回到“ VCInicio”,以便我可以从该Controller进行操作。我看过很多建议使用协议的示例,但我无法使其工作。

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 :(得分:0)

如果您不想使用自定义协议:

假设您将数字存储在某个模型中的变量phoneNumbers: [String]

  1. 让您的VC表视图委托:
self.tableView.delegate = self
  1. 扩展ViewController以符合UITableViewDelegate协议
class VCInicio: UIViewController, UITableViewDelegate {

//...

}
  1. 实施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)
   }

}
  1. 在您用于创建单元格的UITableViewDataSource方法中,将VCInicio作为单元格的委托
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   // assuming you have your cell here
   cell.delegate = self

   return cell
}
  1. 使您的VC符合CustomiseTableViewCellDelegate协议
class VCInicio: UIViewController, CustomiseTableViewCellDelegate {

//...

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

}

答案 1 :(得分:0)

下面的代码现在用于带有手势识别器的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 }
}