我有一个视图控制器“ VCInicio”,该视图控制器中有一个TableView,该TableView的单元格为.xib格式,这些单元格有一个自定义类,称为“ CustomiseTableViewCell”,在其中,我有逻辑并在每次单击RadioButton时打印一个字符串(电话号码),它会打印其电话号码,我可以打印该值(来自CustomiseTableViewCell类)并在控制台上查看该值,但我需要将该值发送回到“ VCInicio”,以便我可以从该Controller进行操作。我看过很多建议使用协议的示例,但我无法使其工作。
编辑:由于我使用的结构,我无法使用 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
}
}
答案 0 :(得分:0)
如果您不想使用自定义协议:
假设您将数字存储在某个模型中的变量phoneNumbers: [String]
self.tableView.delegate = self
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
}
}
使用协议:
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
}
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 }
}