Présentation de SwiftUI: création d'une application simple à l'aide de TableView

Pendant la WWDC 2019, l'un des moments les plus importants et les plus excitants a été l'annonce de la sortie de SwiftUI. SwiftUI est un framework complètement nouveau qui vous permet de concevoir et de développer des interfaces utilisateur en écrivant moins de code de manière déclarative.

Contrairement à UIKit, qui était couramment utilisé en conjonction avec les storyboards , SwiftUI est entièrement basé sur un logiciel. Cependant, la syntaxe est très facile à comprendre et le projet peut être rapidement visualisé à l'aide de l'aperçu automatique.

Étant donné que SwiftUI utilise le langage Swift, il vous permet de créer des applications de la même complexité avec beaucoup moins de code. De plus, l'utilisation de SwiftUI permet automatiquement à l'application d'utiliser des fonctionnalités telles que le type dynamique , le mode sombre , la localisation et l' accessibilité . De plus, il est disponible sur toutes les plateformes, y compris macOS , iOS , iPadOS , watchOS et tvOS . Ainsi, votre code d'interface utilisateur peut maintenant être synchronisé sur toutes les plates-formes, ce qui vous donne plus de temps pour vous concentrer sur un code spécifique à la plate-forme secondaire.

À propos de cet article


Il est important que les développeurs apprennent à utiliser SwiftUI à un stade plus précoce, car Apple concentrera finalement la majeure partie de son attention sur ce cadre. Dans cet article, nous allons examiner les bases de SwiftUI et apprendre à créer une navigation minimale, afficher des images, du texte et des listes en créant une simple liste de contacts qui affiche tous les membres de notre équipe. Lors du choix d'un membre de l'équipe, l'application affiche des informations détaillées qui contiennent l'image de l'utilisateur avec sa brève biographie. Commençons!

Lancez Xcode 11 . Au moment d'écrire ces lignes, Xcode 11 est toujours en version bêta, donc certaines fonctionnalités peuvent ne pas fonctionner comme prévu. Dans cet article, nous utiliserons Swift 5 . Bien que la connaissance avancée de Swift ne soit pas requise pour cet article, la compréhension des bases du langage est toujours recommandée.

Note de l'éditeur: pour prévisualiser et interagir avec les images de Canvas dans Xcode, assurez-vous que Mac OS 10.15 beta est installé.

Création d'un nouveau projet à l'aide de SwiftUI


Commençons à nouveau pour voir immédiatement comment lancer l'application SwiftUI. Ouvrez d'abord Xcode et sélectionnez «Créer un nouveau projet Xcode». Pour la plate-forme iOS, sélectionnez l'application Single View. Saisissez un nom pour l'application et remplissez les champs de texte. Cependant, assurez-vous que Use SwiftUI est coché en bas. Si vous ne sélectionnez pas cette option, Xcode créera un fichier de storyboard pour vous.

image

Xcode créera automatiquement un fichier appelé ContentView.swift, et il sera surprenant qu'un aperçu de votre code s'affiche sur le côté droit, comme illustré ci-dessous.

image

Si vous ne voyez pas l'aperçu, vous devez cliquer sur le bouton Reprendre dans la zone d'aperçu. La compilation du projet prendra du temps. Soyez patient et attendez la fin de la compilation.

Voyons maintenant comment modifier ces fichiers pour créer une application.

Créer une vue de liste


La création d'une vue de liste s'effectue en trois étapes. La première consiste à créer des lignes dans une liste. Peut-être que la conception est similaire à UITableView. Pour ce faire, créez un ContactRow. La deuxième étape est le transfert des données nécessaires à la liste. J'ai des données qui sont déjà encodées, et il suffit de quelques modifications pour associer la liste aux données. La dernière étape consiste simplement à ajouter la barre de navigation et à intégrer la liste dans la vue de navigation. C'est assez simple. Voyons maintenant comment tout cela a été implémenté dans SwiftUI.

Créer une liste d'enseignants


Tout d'abord, vous devez créer une vue pour afficher une liste de tous les membres de l'équipe, y compris des photos de leur profil et de leur description. Voyons comment cela peut être fait.

Comme nous pouvons le voir, le code généré a un composant Text avec la valeur "Hello World". Dans l'éditeur de code, remplacez la valeur de code par "Simon Ng".

struct ContentView: View { var body: some View { Text("Simon Ng") } } 


Si tout fonctionne correctement, à droite, vous devriez voir une mise à jour automatique. C'est l'effet de la visualisation instantanée, comme nous nous y attendions.

image

Ajoutons un nouvel élément Text dans l'application. Ce sera une brève description du participant. Pour ajouter un nouvel élément d'interface à l'application, vous devez cliquer sur le bouton + dans le coin supérieur droit. Une nouvelle fenêtre apparaît avec une liste de différentes vues. Déplacez la vue avec le nom Texte et placez-la sous l'élément Texte d' origine, comme illustré ci-dessous.

image

Faites attention au code à gauche:

 struct ContentView: View { var body: some View { VStack { Text("Simon Ng") Text("Placeholder") } } } 


Vous pouvez remarquer qu'un nouvel élément Text a été ajouté sous Text View avec une valeur de Simon Ng. La différence est que maintenant cette vue semble avoir enveloppé la vue dans quelque chose appelé VStack. VStack est utilisé pour la pile verticale et remplace la disposition automatique dans SwiftUI. Si vous avez de l'expérience dans le développement de logiciels pour watchOS, vous savez probablement qu'il n'y a pas de restrictions, de plus, tous les éléments sont placés dans des groupes. Avec une pile verticale, toutes les vues seront organisées verticalement.

Maintenant, changez le texte de "Placeholder" en "Fondateur d'AppCoda"

Ensuite, ajoutons une image à gauche de ce texte. Puisque nous voulons positionner la vue horizontalement avec les vues existantes, il est nécessaire d'encapsuler VStack dans HStack. Pour ce faire, faites ⌘ + Cliquez sur VStack, puis sélectionnez Intégrer dans HStack. Jetez un œil à ceci ci-dessous:

image

Ce code devrait ressembler à ceci:

 struct ContentView: View { var body: some View { HStack { VStack { Text("Simon Ng") Text("Founder of AppCoda") } } } } 


Il n'y a pas encore de changements importants, mais maintenant nous allons ajouter une image. Modifiez le code pour qu'il ressemble à ceci:

 struct ContentView: View { var body: some View { HStack { Image(systemName: "photo") VStack { Text("Simon Ng") Text("Founder of AppCoda") } } } } 


À partir d'iOS 13, Apple présente une nouvelle fonctionnalité appelée SFSymbols. SF Symbols, développé par Apple, est une collection de plus de 1 500 caractères pouvant être utilisés dans des applications. Parce qu'ils peuvent facilement s'intégrer à la police du système de San Francisco, les caractères fournissent automatiquement un alignement vertical optique avec du texte de n'importe quelle taille. Comme nous n'avons pas encore d'images de nos professeurs, nous utiliserons ce que l'on appelle l'espace réservé.

image

Concentrons-nous maintenant sur quelques problèmes de conception mineurs. Puisqu'il est nécessaire d'émuler l'apparence de UITableRow , alignons le texte à gauche (c'est-à-dire, faites-en le principal). Pour ce faire, faites ⌘ + Cliquez sur VStack et cliquez sur Inspecter . Sélectionnez l'icône d'alignement à gauche comme indiqué ci-dessous:

image

Ensuite, nous verrons un changement dans le code. De plus, le code sera modifié en temps réel pour afficher les nouveaux changements.

 VStack(alignment: .leading) { ... } 


Maintenant que la deuxième vue de texte est le titre, changeons la police. Comme précédemment, ⌘ + Cliquez sur la représentation textuelle de «Fondateur d'AppCoda» en mode aperçu et sélectionnez Inspecter. Changez la police en «Subheadline» et affichez un aperçu et un changement de code en temps réel.

image

Modifions également la couleur et définissons-la sur «Gris». Ce code devrait ressembler à ceci:

 struct ContentView: View { var body: some View { HStack { Image(systemName: "photo") VStack(alignment: .leading) { Text("Simon Ng") Text("Founder of AppCoda") .font(.subheadline) .color(.gray) } } } } 


Maintenant, après avoir terminé la conception d'un certain nombre d'échantillons, nous arrivons à la partie magique. Découvrez à quel point il est facile de créer une liste. Exécutez ⌘ + Cliquez sur HStack et cliquez sur Intégrer dans la liste. Voila! Voyez comment le code changera automatiquement, et la zone vide affichera 5 belles nouvelles lignes, chacune montrant Simon Ng en tant que membre de l'équipe.

image

Assurez-vous également de noter comment la liste a été créée dans le code. En supprimant HStack et en le remplaçant par une liste en double, une vue de table a été créée. Pensez maintenant au temps que vous avez économisé et à la quantité de code que vous avez écrite, en évitant toutes ces UITableViewDataSource, UITableViewDelegate, mise en page automatique, implémentations pour le mode sombre, etc. Tout cela en soi montre la puissance et la force de SwiftUI. Cependant, nous sommes loin d'être terminés. Ajoutons de vraies données à la nouvelle liste.

Connecter des données à une liste


Les données dont nous avons besoin sont une liste des membres de l'équipe et leur biographie ainsi qu'un dossier avec toutes leurs images. Vous pouvez télécharger les fichiers nécessaires ici . Vous devriez trouver 2 fichiers avec les noms Tutor.swif t et Tutor.xcasset s.

Après le téléchargement, importez le fichier avec l'extension Swift et le dossier de ressources dans le projet Xcode. Pour les importer, faites-les simplement glisser dans le navigateur de projet.

Dans le fichier Tutor.swif t, nous déclarons la structure Tutor et la mettons en conformité avec le protocole identifiable. Vous comprendrez pourquoi cela est important plus tard. Nous définissons également les variables id, nom, titre, bio et imageName. Enfin, ajoutez quelques données de test qui seront utilisées dans notre application. Tutor.xcassets a des images de tous les membres de l'équipe.

Revenez à ContentView.swift et modifiez le code comme suit:

 struct ContentView: View { //1 var tutors: [Tutor] = [] var body: some View { List(0..<5) { item in Image(systemName: "photo") VStack(alignment: .leading) { Text("Simon Ng") Text("Founder of AppCoda") .font(.subheadline) .color(.gray) } } } } #if DEBUG struct ContentView_Previews : PreviewProvider { static var previews: some View { //2 ContentView(tutors: testData) } } #endif 


Tout est assez simple:
  1. Définissez une nouvelle variable appelée tuteurs, qui est un tableau vide de structures Tutor.
  2. Étant donné que nous définissons une nouvelle variable pour la structure ContentView, vous devez donc également modifier ContentView_Previews pour afficher cette modification. Définissez le paramètre tuteurs sur testData.

Il n'y aura aucun changement dans l'aperçu, car nous n'utilisons pas encore les données de test. Pour afficher les données de test, modifiez le code comme suit:

 struct ContentView: View { var tutors: [Tutor] = [] var body: some View { List(tutors) { tutor in Image(tutor.imageName) VStack(alignment: .leading) { Text(tutor.name) Text(tutor.headline) .font(.subheadline) .color(.gray) } } } } 


Assurez-vous que ContentView utilise des tuteurs pour afficher les données à l'écran.

Et voilà! Découvrez comment la vue a changé.

image

Les images sont affichées sous forme de carré. J'aimerais qu'ils aient l'air plus arrondis. Voyons comment créer une image aux coins arrondis. Dans le coin supérieur droit, cliquez sur le bouton + et accédez au deuxième onglet. Cela affichera une liste de modificateurs de disposition que vous pouvez ajouter aux images.

image

Recherchez Rayon d'angle, faites-le glisser depuis la fenêtre d'aperçu et placez-le sur l'image. Vous devriez voir le code modifié et l'image d'aperçu sera modifiée comme suit.

image

Cependant, un rayon de courbe de 3 est trop petit. Alors, changez-le à 40. Ainsi, nous obtenons de belles images arrondies.

image

La cellule et la liste sont prêtes! Ensuite, vous devez afficher des informations détaillées lorsque l'utilisateur clique sur la cellule. Commençons par créer la navigation.

Créer une navigation


La vue de navigation enveloppe la vue existante dans la barre de navigation et le contrôleur de navigation. Vraisemblablement, vous connaissez déjà le Storyboard et vous savez qu'il est assez simple d'incorporer la vue dans l'interface de navigation. Il vous suffit de quelques clics.

Dans SwiftUI, l'encapsulation d'une vue Liste dans une NavigationView est également très simple. Tout ce que vous avez à faire est de changer le code comme suit:

 ... var body : some View { NavigationView { List(tutors) { tutor in ... } } } ... 


Vous devez encapsuler le code de liste dans une NavigationView. Par défaut, la barre de navigation n'a pas de titre. L'aperçu devrait déplacer la liste vers le bas, laissant un très grand écart au milieu. En effet, nous n'avons pas défini de titre pour la barre de navigation. Pour résoudre ce problème, vous devez définir l'en-tête en ajoutant la ligne de code suivante (c'est-à-dire .navigationBarTitle):

 ... var body : some View { NavigationView { List(tutors) { tutor in ... } .navigationBarTitle(Text("Tutors")) } } ... 


L'écran devrait maintenant ressembler à ceci:

image

Ensuite, définissez le bouton de navigation. NavigationButton conduit à un nouvel écran, qui se trouve sur la pile de navigation. Tout comme nous avons encapsulé la liste dans une navigation, nous devons envelopper le contenu de la liste avec le bouton de navigation, comme indiqué ci-dessous:

 ... var body : some View { NavigationView { List(tutors) { tutor in NavigationButton(destination: Text(tutor.name)) { Image(tutor.imageName) VStack(alignment: .leading) { Text(tutor.name) Text(tutor.headline) .font(.subheadline) .color(.gray) } } } .navigationBarTitle(Text("Tutors")) } } ... 


Le nom du membre de l'équipe s'affiche désormais dans une vue détaillée. Il est maintenant temps de le vérifier.

Dans le mode d'aperçu actuel, vous ne pouvez pas interagir avec la vue. Habituellement, lorsque vous cliquez sur un aperçu, une simple sélection de code se produit. Pour exécuter le test et vérifier l'interaction avec l'interface utilisateur, vous devez cliquer sur le bouton de lecture dans le coin inférieur droit.

image

La vue deviendra sombre et vous devrez peut-être attendre quelques secondes jusqu'à ce que le simulateur entier se charge avant qu'il ne soit possible d'interagir réellement avec les vues.

image

Lorsque le téléchargement est terminé, vous pouvez cliquer sur la cellule, et elle ira à une nouvelle vue dans la pile, dans laquelle le nom de la cellule sélectionnée sera affiché.

image

Avant de passer à la mise en œuvre d'une vue détaillée, permettez-moi de vous montrer une technique délicate qui vous aidera à rendre votre code plus lisible. ⌘ + Cliquez sur NavigationButton et sélectionnez «Extraire la sous-vue».

Boum! Vous pouvez voir que tout le code du NavigationButton a été créé dans une structure complètement nouvelle, ce qui le rend très lisible. Renommez ExtrectedView en TutorCell.

Vous pouvez maintenant obtenir l'erreur dans TutorCell. En effet, nous n'avons pas le paramètre tuteur à passer à cette structure. La correction de l'erreur est très simple. Ajoutez une nouvelle constante à la structure TutorCell comme suit:

 struct TutorCell: View { let tutor: Tutor var body: some View { ... } } 


Et, dans ContentView, ajoutez le paramètre manquant en changeant la ligne en:

 ... List(tutors) { tutor in TutorCell(tutor: tutor) }.navigationBarTitle(Text("Tutors")) ... 


C'est tout! Il y a une liste et des cellules, toutes sont bien pensées et organisées dans l'ordre requis! Ensuite, nous allons créer une vue détaillée qui montrera toutes les informations sur l'enseignant.

image

Création d'une vue pour afficher des informations détaillées.


Créons un nouveau fichier en allant dans Fichier> Nouveau> Fichier. Sous iOS, sélectionnez SwiftUI View et nommez ce fichier TutorDetail .

image

Dans l'aperçu, la vue de base principale a déjà été créée. Travaillons avec lui. Tout d'abord, cliquez sur le bouton + et placez l'image sur la vue Texte déjà intégrée. Définissez le nom de l'image sur "Simon Ng". Une photo de Simon devrait apparaître. Modifiez maintenant le code comme indiqué ci-dessous:

 struct TutorDetail: View { var body: some View { //1 VStack { //2 Image("Simon Ng") .clipShape(Circle()) .overlay( Circle().stroke(Color.orange, lineWidth: 4) ) .shadow(radius: 10) //3 Text("Simon Ng") .font(.title) } } } 


En général, ce code est assez clair, mais si vous avez besoin de clarification, ne vous inquiétez pas. Voici ce qui se passe:
  1. Tout d'abord, nous regroupons toutes nos vues dans une pile verticale. Ceci est essentiel à la mise en page de la conception que nous adopterons.
  2. Ensuite, nous prenons l'image de Simon et l'animons. Tout d'abord, définissez les clips d'image sous la forme d'un cercle. Au lieu de définir le cornerRadius, c'est beaucoup plus efficace car le cercle peut être adapté à différentes tailles d'image. Nous ajoutons une superposition de cercle avec un cadre blanc qui fournit un beau cadre orange. Enfin, nous ajouterons une légère ombre pour fournir une certaine profondeur d'image.
  3. Notre dernière ligne de code définit la police du nom de l'enseignant sur la police du titre.


image

Vous devez également ajouter deux autres vues de texte: le titre et la biographie. Faites glisser les deux vues de texte sous la vue de texte avec le nom de l'enseignant et modifiez-les:

 struct TutorDetail: View { var body: some View { VStack { Image("Simon Ng") .clipShape(Circle()) .overlay( Circle().stroke(Color.orange, lineWidth: 4) ) .shadow(radius: 10) Text("Simon Ng") .font(.title) Text("Founder of AppCoda") Text("Founder of AppCoda. Author of multiple iOS programming books including Beginning iOS 12 Programming with Swift and Intermediate iOS 12 Programming with Swift. iOS Developer and Blogger.") } } } 


image

La bonne nouvelle est que nous avons une vue texte. La mauvaise nouvelle, c'est qu'ils ont l'air mauvais et ne montrent pas la différence entre le titre et la description détaillée. De plus, la vue texte de la biographie n'affiche pas tout le texte. Corrigeons-le.

Mettez à jour le code comme suit:

 struct TutorDetail: View { var body: some View { VStack { Image("Simon Ng") .clipShape(Circle()) .overlay( Circle().stroke(Color.orange, lineWidth: 4) ) .shadow(radius: 10) Text("Simon Ng") .font(.title) //1 Text("Founder of AppCoda") .font(.subheadline) //2 Text("Founder of AppCoda. Author of multiple iOS programming books including Beginning iOS 12 Programming with Swift and Intermediate iOS 12 Programming with Swift. iOS Developer and Blogger.") .font(.headline) .multilineTextAlignment(.center) } } } 


  1. Nous installons d'abord le «fondateur d'AppCoda» avec la police de sous-titre.
  2. De la même manière, nous définissons la représentation textuelle de la biographie en utilisant la police du titre. Nous alignerons également le texte sur la ligne .multilineTextAlignment (.center)


image

Corrigeons l'erreur suivante. Nous devons afficher le texte entier de la représentation textuelle de la biographie. Cela peut être facilement fait en ajoutant une nouvelle ligne de code:

 ... Text("Founder of AppCoda. Author of multiple iOS programming books including Beginning iOS 12 Programming with Swift and Intermediate iOS 12 Programming with Swift. iOS Developer and Blogger.") .font(.headline) .multilineTextAlignment(.center) .lineLimit(50) ... 


image

Tout a l'air bien. Il y a un dernier changement de conception que je veux faire. Le titre et les représentations textuelles de la biographie sont trop proches les uns des autres. J'aimerais avoir un peu d'espace entre ces deux points de vue. De plus, je voudrais ajouter une indentation à toutes les torsions afin qu'elles ne touchent pas les bords de l'appareil. Assurez-vous de modifier le code comme suit:

 struct TutorDetail: View { var body: some View { VStack { Image("Simon Ng") .clipShape(Circle()) .overlay( Circle().stroke(Color.orange, lineWidth: 4) ) .shadow(radius: 10) Text("Simon Ng") .font(.title) Text("Founder of AppCoda") .font(.subheadline) //1 Divider() Text("Founder of AppCoda. Author of multiple iOS programming books including Beginning iOS 12 Programming with Swift and Intermediate iOS 12 Programming with Swift. iOS Developer and Blogger.") .font(.headline) .multilineTextAlignment(.center) .lineLimit(50) //2 }.padding() } } 


Ici, nous apportons quelques modifications:
  1. Ajouter un séparateur est aussi simple que d'appeler Divider ()
  2. Pour ajouter un remplissage à la pile verticale entière, vous devez appeler .padding () à la fin de la déclaration VStack.


image

C'est tout! Félicitations! L'écran de vue détaillée est prêt. Il ne reste plus qu'à relier notre liste d'enseignants et leur description détaillée. C'est assez simple.

Transfert de données


Pour transférer des données, vous devez déclarer certains paramètres dans la structure TutorDetail . Avant de déclarer une variable de corps, ajoutez les variables suivantes:

 var name: String var headline: String var bio: String var body: some View { ... } 


Ce sont les paramètres que nous passerons de ContentView. Apportez les modifications suivantes:

 ... var body: some View { VStack { // 1 Image(name) .clipShape(Circle()) .overlay( Circle().stroke(Color.orange, lineWidth: 4) ) .shadow(radius: 10) //2 Text(name) .font(.title) //3 Text(headline) .font(.subheadline) Divider() //4 Text(bio) .font(.headline) .multilineTextAlignment(.center) .lineLimit(50) //5 }.padding().navigationBarTitle(Text(name), displayMode: .inline) } ... 


  1. Remplacez le nom du professeur pour l'image par le nom de la variable
  2. Remplacez le texte du titre par la variable de titre
  3. Enfin, remplacez le long paragraphe de texte par la variable bio
  4. Une ligne de code a également été ajoutée qui définit le titre de la barre de navigation sur le nom de l'enseignant.


Enfin, nous devons ajouter les paramètres manquants à la structure TutorDetail_Previews.

 #if DEBUG struct TutorDetail_Previews : PreviewProvider { static var previews: some View { TutorDetail(name: "Simon Ng", headline: "Founder of AppCoda", bio: "Founder of AppCoda. Author of multiple iOS programming books including Beginning iOS 12 Programming with Swift and Intermediate iOS 12 Programming with Swift. iOS Developer and Blogger.") } } #endif 


Dans le code ci-dessus, nous ajoutons les paramètres manquants et remplissons les informations avec celui que nous avions auparavant.

Vous vous demandez peut-être ce qui s'est passé avec les instructions #if DEBUG / # endif . Cela signifie que tout code contenu dans ces commandes ne sera exécuté que lors de la prévisualisation à des fins de débogage. Dans votre dernière candidature, ce ne sera pas le cas.

Rien ne devrait changer, car les informations sont également inchangées.

image

Et donc, la dernière étape consiste à associer cette vue à la liste. Basculez vers le fichier ContentView.swift. Tout ce que vous devez faire est de modifier une ligne de code dans la structure TutorCell. Modifiez le code NavigationButton en dessous:

 ... var body: some View { return NavigationButton(destination: TutorDetail(name: tutor.name, headline: tutor.headline, bio: tutor.bio)) { ... } } ... 


Au lieu d'afficher la vue avec le nom de l'enseignant, vous devez changer la destination en TutorDetail lors du remplissage des données pertinentes. Ce code devrait ressembler à ceci:

image

Cliquez sur le bouton de lecture et interagissez avec la vue. Si tout fonctionne bien, l'application fonctionnera également bien.

Sélectionnez simplement l'une des entrées des membres:

image

Et puis les détails du participant seront affichés sur l'écran détaillé.

image

Conclusion


Cet article présente les bases de SwiftUI. Il sera désormais pratique de créer des applications simples, comme un planificateur de tâches, etc. Je suggère de jeter un œil à certaines des ressources ci-dessous, telles que la documentation d'Apple et les sessions WWDC 2019 sur ce cadre.

Documentation SwiftUI
Tutoriels SwiftUI
Présentation de SwiftUI: création de votre première application
SwiftUI Essentials

Ce cadre est l'avenir d'Apple, donc c'est génial si vous commencez avec. N'oubliez pas que si vous n'êtes pas sûr du code, essayez de travailler avec des aperçus automatiques et voyez si vous pouvez apporter des modifications directement à l'interface utilisateur pour voir comment le code est généré. Si vous avez des questions, n'hésitez pas à les poser dans les commentaires ci-dessous.

Pour référence, vous pouvez télécharger le projet terminé ici .

Source: https://habr.com/ru/post/fr461645/


All Articles