Bannière de notification et customView

InsouInsou Membre

Salut tout le monde,

Mon manque de connaissance sur le sujet me fait me heurté à un petit problème :D

Je m'explique :

J'aimerai avoir une bannière qui descend et avec laquelle je peux interagir..
J'utilise NotificationBanner pour toute mes notifications, c'est simple et efficace pour afficher du texte..

Maintenant, j'aimerai aller plus loin et afficher un notification "custom" et interagir avec..
Voila le résultat souhaité :

De ce que j'ai compris, il faut que je fasse une customView et que je l'utilise comme ça :

let banner = NotificationBanner(customView: NorthCarolinaBannerView())
banner.show()

Dans son exemple (avec NorthCarolinaBannerView), il créé sa vue de A à Z avec du code..
Je ne trouve pas ça pratique et j'ai cru comprendre que je pouvais créer un xib pour créer ma customView..

J'ai donc suivi ce tuto et je me retrouve avec ça :

En s'arrêtant ici.. Est ce que j'ai l'air sur la bonne voie ?

Ensuite j'ai essayé d'utiliser cette customView avec NotificationBanner de cette façon..

let maCustomView = BannerEtesVousEnSecuriteView()
let banner = NotificationBanner(customView: maCustomView)
banner.show()

Mais je me retrouve avec cette erreur :

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/dev/Library/Developer/CoreSimulator/Devices/00FC97BD-F89E-4462-ABF3-ECE9000315B2/data/Containers/Bundle/Application/82E9AA7A-2E83-4DC8-B6E4-0F0EACFEAFCB/monApp.app> (loaded)' with name 'BannerEtesVousEnSecuriteView''

Est ce que je n'ai pas oublié un petit truc quelque part ? :/
Là j'avoue que je bloque un peu..

Merci de votre aide :)

Réponses

  • InsouInsou Membre

    Personne n'a jamais été confronté à ce genre de soucis ? :/

  • LarmeLarme Membre

    Plusieurs raisons possibles. As-tu cherché ton erreur ?

    En théorie BannerEtesVousEnSecuriteView(), cela ne devrait pas appeler init(frame:) ou init(coder:). As-tu regardé si ton code était bien appelé ? Le commonInit() ne devrait pas non plus être appelé. Donc pas de "commonInit ICI" dans le console je suppose ?

    Si c'est le cas, cherche ton erreur. Cela peut-être lié à un renommage, une non-inclusion dans la target du xib, une case à cocher (Inherit Module from Target), le module mal set à ta target, etc. Cf. https://stackoverflow.com/a/28037785/1801544 par exemple

  • InsouInsou Membre
    29 avril modifié #4

    En théorie BannerEtesVousEnSecuriteView(), cela ne devrait pas appeler init(frame:) ou init(coder:). As-tu regardé si ton code était bien appelé ? Le commonInit() ne devrait pas non plus être appelé. Donc pas de "commonInit ICI" dans le console je suppose ?

    Hé bien si, j'ai bien mon "commonInit Ici" dans la console..
    C'est juste après que ça foire :/

    Si c'est le cas, cherche ton erreur.

    Si c'est le cas de quoi ?
    Si c'est le cas que le "commonInit ici" ne s'affiche pas ?
    Ou si il s'affiche ?

    une case à cocher (Inherit Module from Target)

    J'ai vérifié ça, ma case est bien cochée..

    Je vais continuer de chercher mais comme c'est la première fois que j'essaie d'inclure un xib, j'ai pas toute les subtilités..

    Si vous avez d'autres pistes, n'hésitez pas :)

  • InsouInsou Membre

    Bon.. je crois que j'ai compris l'erreur..
    Dans ma fonction "commonInit()", j'ai pas mis le bon nom du xib à charger..

    J'ai donc remplacé "BannerEtesVousEnSecuriteView" (qui est le nom de la classe) par "BannerEtesVousEnSecurite" (qui est le nom du fichier xib).

    Maintenant je rentre bien dans ma fonction commonInit() mais ça boucle dedans avant de planter..
    Pourquoi ? :/

    Je me retrouve donc avec ça :

  • LarmeLarme Membre

    Est-ce que faire Bundle.main.loadNibName() devrait appeler selon toi init(frame:) ou init(coder:)?
    Si quelqu'un d'autre voulait faire ça avec ton XIB, aurais-tu envie que cela termine ses customizations qui pourraient être dans ces méthodes ?

    Regarde la Stacktrace pour la réponse.

  • InsouInsou Membre

    Est-ce que faire Bundle.main.loadNibName() devrait appeler selon toi init(frame:) ou init(coder:)?

    init(frame:) ?

    Si quelqu'un d'autre voulait faire ça avec ton XIB, aurais-tu envie que cela termine ses customizations qui pourraient être dans ces méthodes ?

    ça j'ai pas compris :/

    J'ai supprimer le commonInit() de init(coder:) (je suppose que c'était ce que tu voulais expliquer ^^)

    J'ai ma view qui s'affiche sans planter, c'est déjà ça ^^
    il faut que j'améliore encore quelque truc parce que le rendu n'est pas ouf mais au moins là elle s'affiche et ça me débloque pour la suite :)

    Encore merci Larme :)

    (si t'as 2 min pour expliquer un peu où tu voulais en venir, parce que j'ai testé par déduction plus qu'autre chose là..)

  • InsouInsou Membre

    Bon.. décidément je ne m'en sors pas avec cette bannière..

    Voici mon code :

    Ma bannière s'affiche bien mais elle n'est cliquable qu'en partie..
    Je sais pas vraiment comment expliquer ça donc j'ai fait une capture d'écran..

    La zone jaune est cliquable mais la zone bleue non.
    Quand je clic sur le haut d'un bouton (en zone jaune), je détecte bien le clic.
    Quand je clic sur le bas d'un bouton (en zone bleue), je ne détecte pas le clic et ça clic même derrière, comme si tout ce qui était en zone bleu était finalement invisible.

    Comment est ce que c'est possible ? :/

  • LarmeLarme Membre

    @Insou a dit :
    (si t'as 2 min pour expliquer un peu où tu voulais en venir, parce que j'ai testé par déduction plus qu'autre chose là..)

    Il faut apprendre à utiliser les outils du debugger.
    Refais en sorte que ça boucle à l'infini.

    Dans la Debug Bar, clique sur BannerAlert...commonInit()
    Et/ou regarde dans le Debug Navigator le thread courant.
    Tu devrais avoir en boucle les appels fait.

    Je n'ai pas vérifié lequel des deux appelais l'autre.
    Mais Bundle.main.loadNibName() appelle l'une des deux.
    Or, quand tu fais l'une des deux, tu fais commonInit(), qui fait un loadNibName() qui rappelle donc l'une des deux, qui refait un commonInit(), qui fait un loadNibName() , etc...

    Il y a des méthodes qui sont « toujours appelées », comme un viewDidLoad(), etc. Des méthodes basiques, attention à ce que ça ne boucle pas à l'infini.
    Quand tu crées ton propres VC, tu le subclasse, donc tu override viewDidLoad() (souvent c'est le cas), mais tu fais un super.viewDidLoad() normalement, ce qui appelle la méthode mère qui elle peut aussi avoir des customization.

    Maintenant, concernant ton problème de click, utilise le Debug View Hierarchy: https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/special_debugging_workflows.html#//apple_ref/doc/uid/TP40015022-CH9-SW2

Connectez-vous ou Inscrivez-vous pour répondre.