18
votes

Pourquoi certaines vues apparaissent-elles sous la forme d'un signe d'interdiction d'entrée rouge dans les widgets?

J'ai créé un projet dans xcode 12 et ajouté une cible d'extension de widget. La cible est créée et il me reste un simple widget qui affiche l'heure. L'aperçu du widget fonctionne comme prévu et le widget est affiché comme prévu dans le simulateur. Mais si je change la vue pour utiliser la List au lieu du Text , comme ceci:

struct SimpleWidgetEntryView : View {
    var entry: Provider.Entry

    var body: some View {
        List {
            Text("Something")
        }
    }
}

L'aperçu et le simulateur affichent tous deux un signe d'interdiction d'entrée rouge sur fond jaune:

Le signe Aucune entrée affiché dans l'aperçu de xcode 12

J'ai essayé de mettre la List dans un VStack et d'utiliser une liste dynamique sans succès. Je ne trouve aucune documentation sur l'interdiction de List dans un widget. J'ai essayé de redémarrer xcode et le simulateur, de nettoyer et de reconstruire. J'utilise xcode 12.0 beta 3.

~ J'ai aussi ce problème en essayant d'utiliser un UIView enveloppé dans UIViewRepresentable . La vue est une LineChartView de la bibliothèque Charts. ~ Edit: d'après ce post sur les forums de développeurs Apple, il n'est pas possible d'utiliser les vues UIKit dans un widget WidgetKit.

Quelqu'un sait-il comment je peux utiliser une List dans un widget? Toute aide très appréciée. Merci


8 commentaires

Les listes sont des vues de table et les vues de table sont des vues de défilement. Les widgets ne prennent probablement pas en charge les vues de défilement.


Obtenez-vous toujours l'erreur si vous supprimez la ligne: var entry: Povider.Entry?


@EmilioPelaez Cela pourrait bien être le cas. Ce serait bien de voir de la documentation qui dit définitivement d'une manière ou d'une autre.


@RazvanS. L'erreur se produit toujours si je supprime cette ligne (et modifie les emplacements qui s'attendent à la fournir à l'initialiseur par défaut).


@Paul Si je copie votre code dans les terrains de jeux, sans la ligne que j'ai mentionnée, cela fonctionne sans problème. MacOS Catalina, XCode 11.6


Salut @RazvanS. le problème survient dans le contexte de l'utilisation d'une liste dans un widget construit avec WidgetKit


Je rencontre également ce problème, donc toute aide est très appréciée.


Je n'ai pas trouvé de documentation Apple disant qu'un scrollView entraînerait l'apparition de ce grand "ne pas entrer de signe". J'ai trouvé cela, mais cela ressemble plus à une suggestion: "Évitez de mettre une vue de défilement dans un widget Aujourd'hui. Il est difficile pour les utilisateurs de faire défiler un widget sans faire défiler par inadvertance la vue Aujourd'hui." Donc, s'il est vrai que le scrollView fait apparaître le fond jaune rouge ne pas entrer de signe, il serait bon de trouver cela documenté quelque part afin que cette question puisse être officiellement répondue. J'ai aussi ce problème au fait ...


3 Réponses :


6
votes

J'ai reçu ce signe jaune sans entrée (ghostbusters sans le fantôme lol) après avoir essayé d'inclure un graphique de la bibliothèque de graphiques (sous-classe de UIView) à l'aide d'un wrapper UIViewRepresentable. Je ne pouvais pas trouver le signe jaune d'interdiction d'entrée documenté nulle part et je ne savais pas s'il provenait de la bibliothèque de graphiques ou d'iOS lui-même, donc c'était un soulagement de voir que vous avez vu le même problème et cela m'a mis sur la bonne voie pour venir avec une solution.

À partir de ce post que vous avez référencé ci-dessus, un ingénieur Apple déclare: «Les vues UIKit enveloppées dans UIViewRepresentable ne fonctionneront pas dans WidgetKit. Lorsque les vues sont encodées à partir de votre extension pour être affichées, elles apparaîtront vides. Je ne pense pas que ce soit tout à fait exact. Je pense qu'il apparaîtra jaune avec un signe rouge "aucune entrée".

https://developer.apple.com/forums/thread/653471?answerId=619627022#619627022

J'ai contourné ce problème en rendant mon graphique en tant qu'UIImage et en affichant l'image sur le widget au lieu de la version UIView du graphique. Cela devrait suffire à mes fins car je n'ai pas besoin que ce soit interactif comme je le fais dans l'application.


4 commentaires

C'est brillant! En fait, j'ai fini sur cet article parce que j'essaie d'utiliser la même bibliothèque de graphiques et que je me suis retrouvé avec l'erreur rouge / jaune. Pour l'imagerie, traitez-vous cela dans le code du widget ou faites-vous cela dans l'application? Et faites-vous des calculs de taille?


Je crée l'image dans le widget lui-même et je passe un paramètre de taille à la fonction que j'ai écrite pour créer une image de graphique.


Merci, j'ai réussi à faire de même. En utilisant GeometryReader je pourrais passer la taille correcte à une fonction pour faire le UIGraphicsBeginImageContext pour le rendu du graphique. A parfaitement fonctionné :)


Oui, j'utilise également GeometryReader.



4
votes

Utilisez ForEach dans un VStack:

 var body: some View{
        ZStack{
            self.backgroundColor
            VStack{
                ForEach(0...1, id: \.self){ entry in
                    Text("\(entry)")
                }
            }
        }
    }


0 commentaires

6
votes

Contexte

Les vues de widget sont statiques .

Ils ne prennent pas en charge l'animation, la navigation ni l'interaction de l'utilisateur (à l'exception de Link ). Et ils doivent être écrits en SwiftUI pur.


Liste des vues non autorisées dans WidgetKit

Notez que la liste n'est pas exhaustive, fournie principalement avec des exemples:

  1. Vues interactives (celles avec lesquelles vous pouvez interagir, par exemple en les touchant ):

    • List
    • Form
    • ScrollView
    • TabView
    • Map
    • Picker
    • Slider
    • etc...
  2. Vues animées :

    • ProgressView
  3. Vues de navigation (vous ne pouvez pas utiliser la navigation standard - pour cela, vous avez Link ):

    • NavigationView
    • NavigationLink
  4. Wrappers UIKit pour les vues / ViewControllers UIKit:

    • UIViewRepresentable
    • UIViewControllerRepresentable

Remplaçants

Si vous souhaitez utiliser l'une des vues ci-dessus, par exemple une vue interactive comme List , vous devez la créer à partir de vues non interactives - ici VStack + ForEach .


0 commentaires