如何从类属性(特别是 UIButton)访问父类实例?
Posted
技术标签:
【中文标题】如何从类属性(特别是 UIButton)访问父类实例?【英文标题】:How can I access the parent class instance from a class attribute, specifically a UIButton? 【发布时间】:2016-09-02 20:19:14 【问题描述】:我有一个聊天气泡按钮,它调用一个菜单来将文本或图像复制到粘贴板。当我处理长按和双击时,我可以访问按钮本身,但是我需要能够访问包含在单元实例中的消息属性以及聊天气泡按钮。
我的目标是使用从操作函数传递的cell.chatBubble
引用来检索对单元格的引用,以便访问message
数据。
func selfMessageCellForRowAtIndexPath(indexPath: NSIndexPath) -> SelfMessageCell
let cell = self.tableView.dequeueReusableCellWithIdentifier(SelfMessageCellIdentifier) as! SelfMessageCell
let message = self.messages[indexPath.row]
cell.messageLabel.text = message.messageContents
let messageWidth = cell.messageLabel.intrinsicContentSize().width
if messageWidth < (cell.bounds.width * 0.7 - 42)
cell.chatWidth = messageWidth + 33
cell.chatBubble.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(handleCopyGesture(_:))))
cell.chatBubble.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(handleCopyGesture(_:))))
let tap = UITapGestureRecognizer(target: self, action: #selector(handleCopyGesture(_:)))
tap.numberOfTapsRequired = 2
cell.chatBubble.addGestureRecognizer(tap)
cell.transform = self.tableView.transform
return cell
// Extension for chat bubble press handling
extension MessageSuperViewController
func handleCopyGesture(recognizer: UIGestureRecognizer)
if recognizer.state == UIGestureRecognizerState.Began
openCopyMenu(recognizer)
else if !UIMenuController.sharedMenuController().menuVisible
openCopyMenu(recognizer)
func openCopyMenu(recognizer: UIGestureRecognizer)
if let recognizerView = recognizer.view, recognizerSuperView = recognizer.view?.superview
let menuController = UIMenuController.sharedMenuController()
let copyItem = UIMenuItem(title: "Copy", action: #selector(copyMessageContents(_:)))
let moreItem = UIMenuItem(title: "More..", action: #selector(moreMenuItem(_:)))
menuController.menuItems = [copyItem,moreItem]
menuController.setTargetRect(recognizerView.frame, inView: recognizerSuperView)
menuController.setMenuVisible(true, animated: true)
recognizerView.becomeFirstResponder()
func copyMessageContents(sender: UIMenuItem)
func moreMenuItem(sender: UIMenuItem)
【问题讨论】:
你能告诉我们你的handleCopyGesture(_:)
方法吗?
没什么用,我只需要一个带有文字或图片的消息的条件语句
【参考方案1】:
我建议在SelfMessageCell
中添加UITapGestureRecognizer
,当您触发事件时,您可以使用如下委托:
SelfMessageCellDidTapDelegate(sender: SelfMessageCell)
在你拥有selfMessageCellForRowAtIndexPath
的这个类中,你实现了这个委托,sender
将包含你想要的数据。
func selfMessageCellForRowAtIndexPath(indexPath: NSIndexPath) -> SelfMessageCell
let cell = self.tableView.dequeueReusableCellWithIdentifier(SelfMessageCellIdentifier) as! SelfMessageCell
cell.delegate = self
....
SelfMessageCellDidTapDelegate(sender: SelfMessageCell)
print(sender)
【讨论】:
当用户按下复制UIMenuItem
时我将如何修改它以使用它与长按 chatBubble 按钮有点不同
在你的委托中你可以传递recognizer: UIGestureRecognizer
作为第二个参数,这样你就不会破坏你当前的代码
@ggworean 如果你的recognizer.view
是你的chatBubble
,你可以通过sender.chatBubble
看到它以上是关于如何从类属性(特别是 UIButton)访问父类实例?的主要内容,如果未能解决你的问题,请参考以下文章