[Résolu] Quick Actions — relier AppDelegate.swift avec une fonction qui se trouve dans ViewController.swif ou autre

Hello à tous,

Pour mon App, je crée des Quick Actions (3D Touch dans le Home Screen) pour lancer une fonction de mon ViewController… :iphone:

Tout fonctionne correctement, le raccourcis est là, l’icône aussi, ça appelle bien la fonction
func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {

sauf que… dans ma fonction il y a une mise a jour du Storyboard qui semble poser problème vu que AppDelegate.swift exécute ma fonction avant le viewDidLoad de mon ViewController, donc ça plante, à moins que j’ajoute un « ? » sur mon bouton comme ceci, (mais ça ne change pas mon bouton du coup) :

playButton?.setImage(UIImage(named: "stopbutton"), for: .normal)

sinon j’ai le message suivant :

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

Est-ce que quelqu’un saurait comment faire pour attendre que le ViewController soit chargé avant de lancer ma fonction ou comment retarder l’appel de ma fonction? :thinking:

La fonction Sleep(Int) dans AppDelegate.swift ne permet pas de faire ce que je veux, puisque ca met toute l’application en attente :confused:

Je vous met tout le code ci-dessous

AppDelegate.swift :

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
        if shortcutItem.type == "fr.xxxxxxxxxxxxxx.xxxxxxxxxxxxx.playRadio" {
            let mainVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier:"Player") as! ViewController
            mainVC.playPlayer()
        }
}

ViewController.swift :

@objc func playPlayer() {
    setupPlayer()
    RadioPlayer.rate = 1.0
    RadioPlayer.play()
    playButton.setImage(UIImage(named: "stopbutton"), for: .normal) //le soucis vient d'ici...
}

Merci à vous pour le temps passé à lire ceci

Et pourquoi est-ce que cette fonction doit être dans le appdelegate.swift et pas dans le viewDidLoad ?

hello @schtipoun

 func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {

Cette fonction ne peut être ailleurs il me semble? :thinking:

C’est ce que j’ai cru comprendre en faisant mes recherches. :thinking: :face_with_monocle:

Yes @didier, je me suis mal exprimé :slight_smile:
Qu’est-ce qui fait que tu dois mettre une partie de ta fonctionnalité dans le appdelegate.swift et que tu ne puisses pas tout gérer dans le viewDidLoad ?

@schtipoun, je suis désolé, mais je comprend exactement la même chose que dans ta question d’avant. :thinking:

C’est peut etre moi qui me suis mal exprimé dans mon post initial? :thinking:

application(performActionFor shortcutItem) ne peut être que dans AppDelegate.swift
et playplayer() est une fonction qui met à jour l’interface utilisateur et qui crée une instance d’AVPlayer(), donc elle ne peut pas être dans AppDelegate.swift

Sinon, je ne vois pas où tu veux en venir @schtipoun, et je m’en excuse d’avance ^^

Ok :slight_smile:
C’était surtout pour savoir si tu pouvais tout gérer dans le viewDidLoad mais manifestement non ^^

Deja le premier problème que je vois c’est que tu crées un nouveau contrôleur au lieu d’utiliser celui qui est présent actuellement à l’écran.
Regarde comment apple le fait dans leur exemple de démo : Add Home Screen Quick Actions | Apple Developer Documentation

Hello @mbritto

je t’avoue quand je patauge, parce que j’ai regardé un tutoriel sur Youtube que j’ai pas du tout compris. J’ai cherché par rapport au message que tu m’a envoyé et j’ai trouvé la solution :

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
    if shortcutItem.type == "fr.xxxxxxxx.xxxxxxxxxxxxx.playRadio" {
        //window!.rootViewController?.present("Player", animated: true, completion: nil)
        //selectedViewController .playPlayer()
        if let rootViewController = window?.rootViewController as? UITabBarController {
            if let viewController = rootViewController.viewControllers?.first as? ViewController {
                viewController.playPlayer()
            }
        }
    }
} 

et là, ca fonctionne niquel! :wink: MERCI !!!

1 « J'aime »

Cool! Content que tu aies trouvé @didier :slight_smile:

1 « J'aime »