2016-09-02 7 views
1

私はテキストまたはイメージをペーストボードにコピーするためのメニューを呼び出すチャットバブルボタンを持っています。長いプレスとダブルタップを処理すると、ボタン自体にアクセスできますが、チャットバブルボタンの横にあるセルインスタンスに含まれているメッセージ属性にアクセスできる必要があります。クラス属性、特にUIButtonから親クラスインスタンスにアクセスするにはどうすればよいですか?

私は、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) { 

} 
+0

あなたの 'handleCopyGesture(_ :)'メソッドを表示できますか? – keithbhunter

+0

これは大したことではありませんが、文章や画像付きのメッセージには条件文が必要です – ggworean

答えて

0

は私がSelfMessageCellUITapGestureRecognizerを追加することをお勧め、あなたが持っているときにイベントがあなたのようなデリゲートを使用することができ解雇:

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) 
} 
+0

chatBubbleをちょうど押すのと少し違うコピーである 'UIMenuItem'をユーザが押した場合に、あなたのデリゲートの – ggworean

+0

ボタンを使用すると、 'recognizer:UIGestureRecognizer'を2番目のパラメータとして渡すことができるので、現在のコードを壊さないでください。 –

+0

@ggworean' recognizer.view'が 'chatBubble'なら' sender .chatBubble' –

関連する問題