ringcentral / engage-digital-messaging-ios

Engage Digital Messaging IOS SDK
Other
10 stars 6 forks source link

Probléme de clavier #26

Closed InesBokri closed 6 years ago

InesBokri commented 6 years ago

Bonjour,

Comme c'est déjà vu avant, le probleme persiste encore et ce n'est pas résolu encore!

A partir du menu, j'appel une interface qui cintient dimelo, lorsque l'utilisateur saisie son message et ouvre encore une fois le menu, le clavier ne se cache pas. Vous m'avez dit d'ajouter view.endEditing(true) mais dans ce cas (c'est que le clavier se cache à l'ouverture de menu) mais je perds l'accés au clavier a mon retour a l'interface de Dimelo.

dimelo_bug

waelba commented 6 years ago

Bonjour @katasskatouss ,

Il faut utiliser :

dimeloViewController!.becomeFirstResponder() lors de la fermeture de Drawer et l'affichage de Chat et

if dimeloViewController != nil {
      view.endEditing(true)
      dimeloViewController?.view.endEditing(true)
}

lors de l'ouverture de Drawer(lorsque vous voulez quitter le Chat)

InesBokri commented 6 years ago

Bonjour,

Est il possible de me préciser svp c'est quoi cette variable "dimeloViewController" ?

waelba commented 6 years ago

Bonjour,

C'est la vue de Chat.


var dimeloViewController: UIViewController? = nil
dimeloViewController = dimelo!.chatViewController()
InesBokri commented 6 years ago

Bonjour wael,

Je tiens à te remercier pour ta réactivité habituelle mais melheuresement ca ne marche toujours pas : (

Au fait, dans notre appli on a un viewController: contactVC qui contient un subview de dimelo je ne sais pas si cette information peut t'aider?

waelba commented 6 years ago

Bonjour @katasskatouss ,

Le subview de Dimelo est déclaré comment exactement avant de l'ajouter à votre contactVC ?

InesBokri commented 6 years ago

Wael,

j'ai l'interface de contactVC qui contient un container view (qui est le dimeloVC). Du coup dimeloVC , voila son code

import Dimelo

class DimeloViewController: UIViewController, DimeloDelegate {

var dimelo: Dimelo?
var tabChatVC: UIViewController?
var unreadUpdateTimer: Timer?
var unreadFetchInterval: TimeInterval = 0.0
var defaultUnreadFetchInterval: TimeInterval = 5

let viewModel = ContactViewModel()

override func viewDidLoad() {
    super.viewDidLoad()
    self.setupDimelo()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.setupDimelo()
}
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.setupDimelo()
}

// DimeloDelegate
func dimeloDisplayChatViewController(_ dimelo: Dimelo!) {

    let vc: UIViewController? = Dimelo.sharedInstance().chatViewController()
    vc?.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.closeChat))
    if UIDevice.current.userInterfaceIdiom == .pad {
        vc?.modalPresentationStyle = .formSheet
    }
    vc?.modalPresentationStyle = .overCurrentContext
    self.present(vc!, animated: true, completion: {() -> Void in
    })

}

@IBAction func closeChat(_ sender: Any) {
    self.dismiss(animated: true, completion: {() -> Void in
    })
}
func setupDimelo() {
    dimelo = Dimelo.sharedInstance().copy() as? Dimelo
    dimelo?.delegate = self
    dimelo?.developmentAPNS = false
    dimelo?.updateAppBadgeNumber = true
    dimelo?.interactiveNotification = true
    dimelo?.noteUnreadCountDidChange()
    dimelo?.title = " "
    dimelo?.userIdentifier = viewModel.refBp.value
    dimelo?.authenticationInfo = ["reference_client": viewModel.refBp.value,
                                  "nom": viewModel.lastname.value,
                                  "prenom": viewModel.firstname.value,
                                  "email": viewModel.email.value,
                                  "telephone_mobile": viewModel.phone.value]

    let dimeloViewController = dimelo!.chatViewController

    dimeloViewController().navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.closeChat))
    addChildViewController(dimeloViewController())
    dimeloViewController().view.frame = CGRect.init(origin: view.frame.origin, size: view.frame.size)
    view.addSubview(dimeloViewController().view)

    dimeloViewController().didMove(toParentViewController: self)
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Register the device token.
    Dimelo.sharedInstance().deviceToken = deviceToken
}

func dimeloDidBeginNetworkActivity(_ dimelo: Dimelo?) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
}

func dimeloDidEndNetworkActivity(_ dimelo: Dimelo?) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
    //! If notification is from Dimelo, you don't have to handle anything
    if Dimelo.sharedInstance().consumeReceivedRemoteNotification(userInfo) {
        return
    }
}
func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
    //! We simulate remote notification by putting its payload into a local notification.
    if Dimelo.sharedInstance().consumeReceivedRemoteNotification(notification.userInfo) {
        return
    }
        //! You app's handling of this notification.
}

func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [AnyHashable : Any], withResponseInfo responseInfo: [AnyHashable : Any], completionHandler: @escaping () -> Void) {
        Dimelo.sharedInstance().handleRemoteNotification(withIdentifier: identifier, responseInfo: responseInfo)
        if completionHandler != nil {
            completionHandler()
        }
    //! Otherwise, here you app's handling of this notification.
    }

func updateBadge(withUnreadCount count: Int) {
    tabChatVC?.tabBarItem.badgeValue = count > 0 ? "\(count)" : nil
}

func updateUnreadCount() {
unreadUpdateTimer?.invalidate()
Dimelo.sharedInstance().fetchUnreadCount(completionHandler: {(_ unreadCount: Int, _ error: Error?) -> Void in
    if unreadCount == NSNotFound {
        print("error while updating unreadCount : \(error ?? "" as! Error)")
        if (error as NSError?)?.domain == DimeloHTTPErrorDomain && (error as NSError?)?.code == 429 {
            // 429 Too many requests. Be nice, add some delay.
            self.unreadFetchInterval += self.defaultUnreadFetchInterval
        }
    } else {
        self.updateBadge(withUnreadCount: unreadCount)
    }
    self.scheduleUnreadCountUpdateTimer()
})
}

func scheduleUnreadCountUpdateTimer() {
    unreadUpdateTimer?.invalidate()
    unreadUpdateTimer = Timer.scheduledTimer(timeInterval: unreadFetchInterval, target: self, selector: #selector(self.updateUnreadCount), userInfo: nil, repeats: false)
}
func dimeloUnreadCountDidChange(_ notification: Notification?) {
    updateBadge(withUnreadCount: Dimelo.sharedInstance().unreadCount)
    scheduleUnreadCountUpdateTimer()
}

}

image

waelba commented 6 years ago

Bonjour,

Vous pouvez ajouter une NotificationCenter pour cacher le clavier en appuyant sur l'icône de Menu et une autre en fermant le menu pour afficher le clavier:

Dans DimeloViewController :

var dimeloViewController: UIViewController? = nil

func setupDimelo() {
    dimeloViewController = dimelo!.chatViewController()
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.setupDimelo()
    NotificationCenter.default.addObserver(self, selector: #selector(DimeloViewController.closeKeyboard), name: NSNotification.Name(rawValue: "closeKeyboard"), object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(DimeloViewController.openKeyboard), name: NSNotification.Name(rawValue: "openKeyboard"), object: nil)
} 

@objc func openKeyboard() {
    dimeloViewController!.becomeFirstResponder()
}

@objc func closeKeyboard() {
    view.endEditing(true)
    dimeloViewController?.view.resignFirstResponder()
}

en appuyant sur bouton de Menu:

view.endEditing(true)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "closeKeyboard"), object: nil)

en appuyant sur Nous Contacter:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "openKeyboard"), object: nil)

Pouvez vous tester ça ?

InesBokri commented 6 years ago

Bonjour,

Je visn d'intégrer ce que vous m'avez passé. Mais ca marche toujours pas!

Au fait lorsque je suis dans la page contact (là ou il y a dimelo) et par la suite je clique sur le buttton menu pour ouvrir le Menu alors le clavier ca se cache (ça c'est bien) Mais lorsque je clique sur le button contact (dans le menu) pour revenir a la page contact, je trouve pas le clavier!!

waelba commented 6 years ago

Bonjour @katasskatouss ,

Je viens de créer un exemple de code sur mesure dont vous pouvez vous inspirer pour résoudre votre souci d'accès au clavier sur votre application iOS (j'ai suivi votre architecture).

DrawerWithDimelo.zip

InesBokri commented 6 years ago

Bonjour,

Je vais tester et je vous met au courant.

Merci @waelbenabdallah

InesBokri commented 6 years ago

Re bonjour,

Ca marche toujours pas! Meme comportement: lorsque j'ouvre le menu, le clavier se cache mais lorsque je reviens je trouve pas le clavier!

InesBokri commented 6 years ago

Bonjour Wael,

C'est bon j'ai trouvé la solution. C'était avec la notification comme l'exemple que tu m'as fourni mais j'ai ajouté le setupDimelo() dans les 2 fonctions Open and close keyboard.

Merci pour ta réactivité.

A bientot peut etre :)

waelba commented 6 years ago

Bonjour @katasskatouss,

Super 👍