UIタップジェスチャスウィフトソリューションが原因でdidSelectRowAtIndexPathが呼び出されていませんか?

Zack117

やあみんな私は迅速にかなり新しいので親切にしてください!キーボードが表示されたときにテキストフィールドを上にスクロールする独自の関数を作成しました。テキストフィールドからタップしてキーボードを閉じるために、タップしたときにテキストフィールドのファーストレスポンダーを辞任するUITapGestureRecognizerを作成しました。

ただし、自動完了テーブルのエントリの1つを選択すると、didSelectRowAtIndexPathは呼び出されません。代わりに、タップジェスチャレコグナイザーが呼び出され、ファーストレスポンダーを辞任したようです。

タップジェスチャレコグナイザーにタップメッセージをUITableViewに渡し続けるように指示する方法があると思いますが、それが何であるかわかりません。objcにはこれに対する解決策しかなく、9年以上前のスタックオーバーフローに関する投稿があります。これに対する更新された解決策があるかどうか疑問に思いました!ありがとう、何が起こっているのかを見たい場合は、これが私のコードです:

class ChatLogController : UIViewController, UITextFieldDelegate , UITableViewDelegate , UITableViewDataSource, UIGestureRecognizerDelegate, UIImagePickerControllerDelegate ,UINavigationControllerDelegate  {

var messages = [Message]()

var user : User?{
    didSet{
     observeMessages()
    }
}

@IBOutlet weak var tabelView: UITableView!
@IBOutlet weak var messageTextField: UITextField!
@IBOutlet weak var bottomViewHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var currentMessageRecieverImage: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    configureTableView()


    currentMessageRecieverImage.translatesAutoresizingMaskIntoConstraints = false;
    currentMessageRecieverImage.layer.cornerRadius = 30;
    currentMessageRecieverImage.layer.masksToBounds = true
    currentMessageRecieverImage.contentMode = .scaleAspectFill
    if let currentMessageRecieverUser = user{
        currentMessageRecieverImage.loadImageUsingCacheWithUrlString(urlString: currentMessageRecieverUser.picURL!);
        print(currentMessageRecieverUser.userName!)
    }


    tabelView.delegate = self;
    tabelView.dataSource = self;
    messageTextField.delegate = self;

    let dragAwayFromTextGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleTapAwayFromTextEdit))
    dragAwayFromTextGesture.direction = UISwipeGestureRecognizerDirection.down
    dragAwayFromTextGesture.delegate = self;
    tabelView.addGestureRecognizer(dragAwayFromTextGesture)

    let dragBackToMessages = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipeBackToMessages))
    dragBackToMessages.direction = UISwipeGestureRecognizerDirection.right
    dragBackToMessages.delegate = self;
    tabelView.addGestureRecognizer(dragBackToMessages)

    let TapAwayFromTextEditTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTapAwayFromTextEdit))
    tabelView.addGestureRecognizer(TapAwayFromTextEditTapGesture)
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

@objc func handleSwipeBackToMessages(){
    dismiss(animated: false, completion: nil)
}

func observeMessages(){
    guard let uid = Auth.auth().currentUser?.uid else{
        return;
    }
    // ref gets user that is logged in
    let ref = Database.database().reference().child("user-messages").child(uid)
    ref.observe(.childAdded) { (snapshot) in
        // gets needed messages
        let messageId = snapshot.key
        let messagesRef = Database.database().reference().child("messages").child(messageId)

        messagesRef.observe(.value, with: { (snapshot) in
            guard let dict = snapshot.value as? [String : AnyObject] else{
                return
            }
            let message = Message()
            message.imageUrl = dict["imageurl"] as? String 
            message.fromId = dict["fromid"] as? String
            message.text = dict["text"] as? String
            message.timestamp = dict["timestamp"] as? String
            message.toId = dict["toid"] as? String


            if message.chatPartnerId() == self.user?.toId{
            self.messages.append(message)
            }
            DispatchQueue.main.async {
                self.tabelView.reloadData()
            }

        })
    }

}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return messages.count;
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cellid" , for: indexPath) as! CustomChatTableViewCell;
    let gray = UIColor(red:0.94, green:0.94, blue:0.94, alpha:1.0)
    let red = UIColor(red:1.00, green:0.22, blue:0.37, alpha:1.0)

    let message = messages[indexPath.item]

    if message.toId == user?.toId{

    cell.messageBackground.backgroundColor = red
        cell.messageLabel.textColor = UIColor.white
    }
    else{
        cell.messageBackground.backgroundColor = gray
        cell.messageLabel.textColor = UIColor.black
    }

    cell.messageLabel.text = message.text
    if message.imageUrl != nil{
        //print(message.imageUrl!)
       // cell.messageImageView.image = UIImage(named : "user.jpg")
        cell.messageImageView.loadImageUsingCacheWithUrlString(urlString: message.imageUrl!)
        //print(cell.messageImageView.image.debugDescription)
        cell.messageImageView.isHidden = false;
        cell.messageImageView.translatesAutoresizingMaskIntoConstraints = false;
        cell.messageImageView.contentMode = .scaleAspectFill
        cell.messageLabel.isHidden = true
        cell.messageBackground.isHidden = true;
    }
    else
    {
        cell.messageImageView.isHidden = true;
        cell.selectionStyle = UITableViewCellSelectionStyle.none

        cell.messageLabel.isHidden = false
        cell.messageBackground.isHidden = false;
    }
    return cell;
}

@objc func handleTapAwayFromTextEdit(){
    //print("handle tap away from text edit running ")
    messageTextField.endEditing(true)

}

@IBAction func backToMessageListPressed(_ sender: Any) {
    dismiss(animated: false, completion: nil)
}

@IBAction func infoButtonPressed(_ sender: Any) {

}
// saves text to fire base

@IBAction func sendButtonPressed(_ sender: Any) {

  handleSendMessageToDataBase()
}

func handleSendMessageToDataBase(){
    let ref = Database.database().reference().child("messages")
    // needed for making list in firebase for unique texts
    let childRef = ref.childByAutoId()

    if messageTextField.text == ""{
        return
    }

    if let message = messageTextField.text{



        let toID = user!.toId!
        let fromId = Auth.auth().currentUser!.uid
        let timeStamp : Int =  Int(Int(NSDate().timeIntervalSince1970))
        print(timeStamp)
        let values = ["text" : message , "toid" : toID , "timestamp" : "\(timeStamp)" , "fromid" : fromId]

        childRef.updateChildValues(values, withCompletionBlock: { (error, ref) in
            if error != nil{
                print(error!)
                return
            }

            let userMessagesref = Database.database().reference().child("user-messages").child(fromId)

            let messageID = childRef.key
            userMessagesref.updateChildValues([messageID: 1])

            let recipientUserMessageRef = Database.database().reference().child("user-messages").child(toID)
            recipientUserMessageRef.updateChildValues([messageID: 1])
        })


    }

    messageTextField.text = ""
    messageTextField.endEditing(true)
}

@IBAction func sendImageButtonPressed(_ sender: Any) {

    handleSendImage()

}

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    print("You selected cell #\(indexPath.row)!")
}


func handleSendImage(){

    let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self
    present(imagePickerController, animated: true, completion: nil)

}


func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    dismiss(animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    var selectedImageFromPicker : UIImage?

    if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage{
        selectedImageFromPicker = editedImage
    }
    else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage{
        selectedImageFromPicker = originalImage
    }
    if let selectedImage = selectedImageFromPicker{
        uploadToFireBaseUsingSelectedImage(selectedImage : selectedImage)
    }

    dismiss(animated: true, completion: nil)

}

   private func uploadToFireBaseUsingSelectedImage(selectedImage : 
UIImage){
    let imageName = NSUUID().uuidString
    let refToStorage = Storage.storage().reference().child("message_images").child(imageName)

if let uploadData = UIImageJPEGRepresentation(selectedImage, 0.2){
    refToStorage.putData(uploadData, metadata: nil, completion: { (metaData, error) in
        if error != nil{
            print("failed to upload firebase image when sending in chatlogcontroller")
            print(error!)
            return
        }
        if let imageURL = metaData?.downloadURL()?.absoluteString{
            self.sendMessageWithImageURL(imageURL: imageURL)
        }

    })

}

}

private func sendMessageWithImageURL(imageURL : String){
    let ref = Database.database().reference().child("messages")
    // needed for making list in firebase for unique texts
    let childRef = ref.childByAutoId()

        let toID = user!.toId!
        let fromId = Auth.auth().currentUser!.uid
        let timeStamp : Int =  Int(Int(NSDate().timeIntervalSince1970))
        print(timeStamp)
        let values = ["imageurl" : imageURL , "toid" : toID , "timestamp" : "\(timeStamp)" , "fromid" : fromId]

        childRef.updateChildValues(values, withCompletionBlock: { (error, ref) in
            if error != nil{
                print(error!)
                return
            }

            let userMessagesref = Database.database().reference().child("user-messages").child(fromId)

            let messageID = childRef.key
            userMessagesref.updateChildValues([messageID: 1])

            let recipientUserMessageRef = Database.database().reference().child("user-messages").child(toID)
            recipientUserMessageRef.updateChildValues([messageID: 1])
        })


}



func textFieldDidBeginEditing(_ textField: UITextField) {

    UIView.animate(withDuration: 0.2, animations:{
        self.bottomViewHeightConstraint.constant = 308;
        self.view.layoutIfNeeded()
    })

}

func textFieldDidEndEditing(_ textField: UITextField) {
    UIView.animate(withDuration: 0.2, animations:{
        self.bottomViewHeightConstraint.constant = 50;
        self.view.layoutIfNeeded()

    })
}

func configureTableView()
{
    tabelView.delegate = self;
    tabelView.dataSource = self;
    tabelView.register(UINib(nibName: "MessageCell" , bundle : nil), forCellReuseIdentifier: "customMessageCell");
    tabelView.allowsSelection = true;

}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    NotificationCenter.default.removeObserver(self);

}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let message = messages[indexPath.item]

    if message.imageUrl != nil{
        return 200
    }



    return (CGFloat((message.text?.count)! + 70) )
}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {

    return 80
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    handleSendMessageToDataBase()
    return true
}

}

ショッキング

解決策は、のプロパティをに設定cancelsTouchesInViewするTapAwayFromTextEditTapGestureことfalseです。これにより、テーブルビューへのタッチが渡されます。

このプロパティに関するAppleのドキュメントから(私の強調で):

このプロパティがtrue(デフォルト)で、受信者がそのジェスチャを認識すると、保留中のジェスチャのタッチはビューに配信されず、以前に配信されたタッチは、ビューに送信されたtouchesCancelled(_:with :)メッセージによってキャンセルされます。 。ジェスチャ認識機能がジェスチャを認識しない場合、またはこのプロパティの値がfalseの場合、ビューはマルチタッチシーケンスのすべてのタッチを受け取ります

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

現在のビューコントローラ内のサブビューでスワイプジェスチャが呼び出されていません

分類Dev

Swiftチュートリアルフードトラッカー:タップジェスチャメソッドは呼び出されません

分類Dev

アプリケーションは、呼び出される前でも、プレフィックスがデフォルトの遅延ロードモジュールのチャンクを生成しています〜..

分類Dev

プッシュ通知を受信していますが、PubNubチャットメッセージペイロードで送信するときにバックグラウンドフェッチがpn_apnsタグで呼び出されていません

分類Dev

キャッチされないエラー:Firebaseオプションでストレージバケットが定義されていません。(ウェブ)

分類Dev

キャッチされなかった例外 'NSInternalInconsistencyException'が原因でアプリを終了しています、理由: 'インデックス0のセクションのインデックス3にオブジェクトがありません'

分類Dev

アプリケーションonCreateがテストで呼び出されていません

分類Dev

ASP.netソリューションの `Global.asax.cs`ファイルの1つに、2つのスタートアッププロジェクトが呼び出されないのはなぜですか?

分類Dev

ソリューションエクスプローラーで参照として宣言せずに、別のプロジェクトからDLLメソッドを呼び出すまたは呼び出すにはどうすればよいですか?

分類Dev

プライベート関数didFinishLaunchingWithOptionsが呼び出されていませんか?(スウィフト3)

分類Dev

アクションクリエーターが呼び出されますが、アクションはディスパッチされません

分類Dev

Angular2アプリケーションでサービスが呼び出されていません

分類Dev

ダブルタップジェスチャメソッドの前にボタンアクションが呼び出されます

分類Dev

C#-リフレクション(SetValue())を介して呼び出されたときに、プロパティセッターでスローされた例外をキャッチできません

分類Dev

Redux Thunk + ReactJS:アクションクリエーターは呼び出されていますが、ディスパッチ関数は呼び出されていません

分類Dev

Laravel 5.3アプリケーションからストアドプロシージャを呼び出すと、「キャッチされていないPDO例外」が発生します

分類Dev

ステータスバー領域でタップジェスチャが検出されませんか?

分類Dev

Jackson @JsonCreatorアノテーションが付けられたコンストラクターがPOJOで呼び出されていませんか?

分類Dev

リストでremove(int index)メソッドを実行してオブジェクトインスタンスを削除すると、ガベージコレクションが呼び出されますか?

分類Dev

そのクラスのオブジェクトが作成されたときにコンストラクターがメモリを取得する外部で関数がクリアされていますか。関数が呼び出されていません

分類Dev

非同期フェッチメソッド呼び出し-オブジェクト参照がオブジェクトのインスタンスに設定されていません

分類Dev

オブジェクトがインターフェイスにキャストされてデフォルトのメソッドが呼び出されないのはなぜですか?

分類Dev

ブロードキャストレシーバーがインターネット接続チェックを呼び出していません

分類Dev

「アプリケーションが実行されていないため、ユーザー補助データを取得できません。-launchを呼び出しましたか?」という理由でiOSUIテストが失敗します。

分類Dev

マルチプロセッシングモジュールによる関数がWindowsで呼び出されたときに、Python実行可能ファイルが新しいウィンドウインスタンスを開く理由

分類Dev

チャットアプリケーションがありますが、これまでのところ、メッセージをデータベースに保存していません。2つの方法のどちらが優れていますか?

分類Dev

ジャクソンポリモーフィックオブジェクトのシリアル化/逆シリアル化-子クラスフィールドにデータが入力されていません

分類Dev

jquery-ui selectmenu-ドロップダウンオプションを動的にロードしているときに、「メニューウィジェットインスタンスにそのようなメソッド 'インスタンス'がありません」と遭遇しました

分類Dev

ウィジェットクラスフレームを呼び出してメインウィンドウアプリケーションクラスにパックするにはどうすればよいですか?tkinter

Related 関連記事

  1. 1

    現在のビューコントローラ内のサブビューでスワイプジェスチャが呼び出されていません

  2. 2

    Swiftチュートリアルフードトラッカー:タップジェスチャメソッドは呼び出されません

  3. 3

    アプリケーションは、呼び出される前でも、プレフィックスがデフォルトの遅延ロードモジュールのチャンクを生成しています〜..

  4. 4

    プッシュ通知を受信していますが、PubNubチャットメッセージペイロードで送信するときにバックグラウンドフェッチがpn_apnsタグで呼び出されていません

  5. 5

    キャッチされないエラー:Firebaseオプションでストレージバケットが定義されていません。(ウェブ)

  6. 6

    キャッチされなかった例外 'NSInternalInconsistencyException'が原因でアプリを終了しています、理由: 'インデックス0のセクションのインデックス3にオブジェクトがありません'

  7. 7

    アプリケーションonCreateがテストで呼び出されていません

  8. 8

    ASP.netソリューションの `Global.asax.cs`ファイルの1つに、2つのスタートアッププロジェクトが呼び出されないのはなぜですか?

  9. 9

    ソリューションエクスプローラーで参照として宣言せずに、別のプロジェクトからDLLメソッドを呼び出すまたは呼び出すにはどうすればよいですか?

  10. 10

    プライベート関数didFinishLaunchingWithOptionsが呼び出されていませんか?(スウィフト3)

  11. 11

    アクションクリエーターが呼び出されますが、アクションはディスパッチされません

  12. 12

    Angular2アプリケーションでサービスが呼び出されていません

  13. 13

    ダブルタップジェスチャメソッドの前にボタンアクションが呼び出されます

  14. 14

    C#-リフレクション(SetValue())を介して呼び出されたときに、プロパティセッターでスローされた例外をキャッチできません

  15. 15

    Redux Thunk + ReactJS:アクションクリエーターは呼び出されていますが、ディスパッチ関数は呼び出されていません

  16. 16

    Laravel 5.3アプリケーションからストアドプロシージャを呼び出すと、「キャッチされていないPDO例外」が発生します

  17. 17

    ステータスバー領域でタップジェスチャが検出されませんか?

  18. 18

    Jackson @JsonCreatorアノテーションが付けられたコンストラクターがPOJOで呼び出されていませんか?

  19. 19

    リストでremove(int index)メソッドを実行してオブジェクトインスタンスを削除すると、ガベージコレクションが呼び出されますか?

  20. 20

    そのクラスのオブジェクトが作成されたときにコンストラクターがメモリを取得する外部で関数がクリアされていますか。関数が呼び出されていません

  21. 21

    非同期フェッチメソッド呼び出し-オブジェクト参照がオブジェクトのインスタンスに設定されていません

  22. 22

    オブジェクトがインターフェイスにキャストされてデフォルトのメソッドが呼び出されないのはなぜですか?

  23. 23

    ブロードキャストレシーバーがインターネット接続チェックを呼び出していません

  24. 24

    「アプリケーションが実行されていないため、ユーザー補助データを取得できません。-launchを呼び出しましたか?」という理由でiOSUIテストが失敗します。

  25. 25

    マルチプロセッシングモジュールによる関数がWindowsで呼び出されたときに、Python実行可能ファイルが新しいウィンドウインスタンスを開く理由

  26. 26

    チャットアプリケーションがありますが、これまでのところ、メッセージをデータベースに保存していません。2つの方法のどちらが優れていますか?

  27. 27

    ジャクソンポリモーフィックオブジェクトのシリアル化/逆シリアル化-子クラスフィールドにデータが入力されていません

  28. 28

    jquery-ui selectmenu-ドロップダウンオプションを動的にロードしているときに、「メニューウィジェットインスタンスにそのようなメソッド 'インスタンス'がありません」と遭遇しました

  29. 29

    ウィジェットクラスフレームを呼び出してメインウィンドウアプリケーションクラスにパックするにはどうすればよいですか?tkinter

ホットタグ

アーカイブ