如何从类属性(特别是 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)访问父类实例?的主要内容,如果未能解决你的问题,请参考以下文章

从类实现时 UIButton 不可点击

java编程,关于父类子类变量赋值问题,和方法调用

关于继承的总结

ES6 代理类,访问私有属性(无法从类未声明的对象中读取私有成员#hidden)

从类加载进内存到对象创建,各部分的执行顺序

java里一个私有的属性如何在其他类里面进行访问?