คุณจำเป็นต้องใช้@objcแอตทริบิวต์ในที่จะใช้กับdidTapCommentButton(_:)#selector
คุณบอกว่าคุณทำอย่างนั้น แต่คุณได้รับข้อผิดพลาดอื่น ฉันเดาว่าข้อผิดพลาดใหม่Postไม่ใช่ประเภทที่เข้ากันได้กับ Objective-C คุณสามารถแสดงเมธอดต่อ Objective-C ได้ก็ต่อเมื่อประเภทอาร์กิวเมนต์ทั้งหมดและประเภทการส่งคืนเข้ากันได้กับ Objective-C
คุณสามารถแก้ไขได้โดยการสร้างPostคลาสย่อยของNSObjectแต่นั่นจะไม่สำคัญเพราะการโต้แย้งdidTapCommentButton(_:)จะไม่เป็นPostอย่างไรก็ตาม อาร์กิวเมนต์ของฟังก์ชันการดำเนินการคือผู้ส่งการดำเนินการและผู้ส่งจะเป็นcommentButtonซึ่งสันนิษฐานว่ากUIButton. คุณควรประกาศdidTapCommentButtonดังนี้:
@objc func didTapCommentButton(sender: UIButton) {
// ...
}
จากนั้นคุณจะประสบปัญหาในการรับปุ่มที่Postตรงกัน มีหลายวิธีที่จะได้รับ นี่คือหนึ่ง
ฉันรวบรวม (เนื่องจากรหัสของคุณบอกcell.commentButton) ว่าคุณกำลังตั้งค่ามุมมองตาราง (หรือมุมมองคอลเลกชัน) และเนื่องจากเซลล์ของคุณมีคุณสมบัติที่ไม่ได้มาตรฐานcommentButtonฉันจึงถือว่าเป็นUITableViewCellคลาสย่อยที่กำหนดเอง สมมติว่าเซลล์ของคุณPostCellประกาศดังนี้:
class PostCell: UITableViewCell {
@IBOutlet var commentButton: UIButton?
var post: Post?
// other stuff...
}
จากนั้นคุณสามารถเดินตามลำดับชั้นของมุมมองจากปุ่มเพื่อค้นหาPostCellและรับโพสต์จากมัน:
@objc func didTapCommentButton(sender: UIButton) {
var ancestor = sender.superview
while ancestor != nil && !(ancestor! is PostCell) {
ancestor = view.superview
}
guard let cell = ancestor as? PostCell,
post = cell.post
else { return }
// Do something with post here
}