Отправьте сообщение и одновременно отклоните клавиатуру в Swift - PullRequest
0 голосов
/ 28 февраля 2020

Синяя стрелка вверх предназначена для отправки сообщения

Blue up Arrow button is for sending a message Я использую следующий метод для отображения и отклонения клавиатуры и сдвига текстовое поле с клавиатурой

       NotificationCenter.default.addObserver(self, selector:#selector(self.keyboardNotification(notification:)),name: UIResponder.keyboardWillChangeFrameNotification,object: nil)



      @objc func keyboardNotification(notification: NSNotification) {

       if let userInfo = notification.userInfo {
           let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
           let endFrameY = endFrame?.origin.y ?? 0
           let duration:TimeInterval = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
           let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
           let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
           let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
           self.view1.frame.origin.y = endFrameY - self.view1.frame.height
           UIView.animate(withDuration: duration,
                                      delay: TimeInterval(0),
                                      options: animationCurve,
                                      animations: { self.view.layoutIfNeeded() },
                                      completion: nil)
       }
   }

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу отправить сообщение и одновременно закрыть клавиатуру. У меня есть кнопка отправки в представлении, которое при нажатии только отклоняет клавиатуру и не отправляет сообщение.

Как можно одновременно отправить сообщение и закрыть клавиатуру?

РЕДАКТИРОВАТЬ: Это мое действие кнопки загрузки

@IBAction func uploadBtn(_ sender: UIButton)
    {


        if photoArray.count > 0 || self.audioRecorded == true || enteredTF.text != ""{

            CustomAlert.showWait()
    var i : Int = 0
            let baseUrl = config.baseURL



     parameters = [

    "SKEY":self.skey,
    "FID":"NEWMESSAGE",
    "HKEY":"5673126578",
    "LONGITUDE" : longitude as? String ?? "",
    "LATITUDE" : latitude as? String ?? "",
    "IPADDRESS" : "\(getIPAddress())",
    "MESSAGE" : enteredTF.text!,
    "USERID" : Uname,
    "PHONEID" : phoneID,
    "TIMEZONE"  : getCurrentTimeZone()]


            print(parameters)

    Alamofire.upload(multipartFormData: { (multipartFormData) in
        for (key, value) in self.parameters {

                    multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: "\(key)" )

                }


            for (image) in self.photoArray {
               // print(i)
                if  let imageData = image.jpegData(compressionQuality: 0.5) {
                    OperationQueue.main.addOperation {

                    multipartFormData.append(imageData, withName: "files", fileName: "image\(i).jpeg", mimeType: "image/jpeg")
                    i=i+1
                    }

                }
            }


        if self.audioRecorded == true
        {
             multipartFormData.append(self.getFileUrl(), withName: "myRecording.m4a")
        }
        else
        {
            multipartFormData.append("".data(using: String.Encoding.utf8)!, withName: "Voice",mimeType: "m4a")
            //i = i+1
        }

    }, usingThreshold: UInt64.init(), to: baseUrl, method: .post) { (result) in
            switch result{
            case .success(let upload, _, _):
                upload.responseString { response in
                    print("Succesfully uploaded  = \(response)")
                    CustomAlert.hideWait()

                            let msg = SCLAlertView()
                            msg.showSuccess("", subTitle: "Your message has been successfully sent")
                    self.enteredTF.text = ""
                    OperationQueue.main.addOperation {

                        self.viewAllMessages()
                        self.photoArray.removeAll()
                        self.imageCollectionV.reloadData()
                    }

                    if let err = response.error{

                        print(err)
                        return
                    }

                }
            case .failure(let error):
                print("Error in upload: \(error.localizedDescription)")

            }
        }


     //   }






        }




    }

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Вместо использования UIResponder.keyboardWillChangeFrameNotification вы можете использовать UIResponder.keyboardWillShowNotification в качестве наблюдателя, когда клавиатура будет отображаться, и UIResponder.keyboardWillHideNotification в качестве наблюдателя, когда клавиатура будет отклонена / скрыта.

На обработчике UIResponder.keyboardWillHideNotification вы можете добавьте свой код для настройки UIView и вызовите свой метод для отправки сообщения

Вот пример кода:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(showKeyboard(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(hideKeyboard), name: UIResponder.keyboardWillHideNotification, object: nil)
}

@objc func showKeyboard(_ notification:NSNotification) {
    if let userInfo = notification.userInfo {
        //TODO: Do your UI Stuff
    }
}

@objc func hideKeyboard() {
    DispatchQueue.main.async {
        //TODO: Do your UI Stuff
    }
    //TODO: Send Message
}
0 голосов
/ 28 февраля 2020

Попробуйте это расширение вместо наблюдателя:

extension UIViewController{
func hideKeyboardWhenTappedAround() {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
}

@objc func dismissKeyboard() {
    view.endEditing(true)
   }
}

И позвоните hideKeyboardWhenTappedAround() как вам нужно.

Надеюсь, это поможет ...

...