ios - 如何从类属性(特别是 UIButton)访问父类实例?

标签 ios swift uibutton

我有一个聊天气泡按钮,它调用一个菜单来将文本或图像复制到粘贴板。当我处理长按和双击时,我可以访问按钮本身,但是我需要能够访问包含在聊天气泡按钮旁边的单元格实例中的消息属性。

我的目标是使用从操作函数传递的 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) {

}

最佳答案

我建议在 SelfMessageCell 中添加 UITapGestureRecognizer,当您触发事件时,您可以使用如下委托(delegate):

SelfMessageCellDidTapDelegate(sender: SelfMessageCell)

并且在您拥有 selfMessageCellForRowAtIndexPath 的此类中,您实现了此委托(delegate),sender 将包含您想要的数据。

func selfMessageCellForRowAtIndexPath(indexPath: NSIndexPath) -> SelfMessageCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier(SelfMessageCellIdentifier) as! SelfMessageCell
    cell.delegate = self
    ....
}

SelfMessageCellDidTapDelegate(sender: SelfMessageCell) {
    print(sender)
}

关于ios - 如何从类属性(特别是 UIButton)访问父类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39300155/

相关文章:

IOS - 如何防止后台按钮被点击?

ios - UIButton 没有出现在 iPhone 5S 上

ios - Swift 中的 KVO AVPlayer.status

ios - 更改字体名称后的运行时更改UIbutton位置

ios - UISplitViewController 一致分隔线

ios - 属性字符串前景色在 Swift 中不起作用

ios - 已部署 + Swift 用户身份验证

swift - Swift 结构定义中的崩溃。有解决方法,但想提高理解

ios - 使用 Swift 自定义导航栏

html - 将 HTML 拆分为页面,不将行切成两半