คุณจำเป็นต้องใช้@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
}