Appli Diaporama

Bonjour à tous,
N’ayant pas réussi à la faire de moi même, je me suis appuyer sur la correction dans le cours.
J’ai 2 petits problemes :
1/ Dans la fonction permettant d’afficher les photos suivantes, si je respecte ce que Maxime nous a montré, je ne vois jamais la derniere photo.
@IBAction func nextPictures() {
var nextPhotoIndex: Int = currentPhotoIndex + 1
if nextPhotoIndex > TOTAL_PICTURES { // !!! le “>=” m’empeche d’atteindre la derniere photo !!!
nextPhotoIndex = 0
}
showPictures(atindex: nextPhotoIndex)
}
2/ Dans la fonction permettant l’affichage des photos, je suis contraint de soustraire “-1” à la variable passée en paramètre lorsque je m’en sers pour nommé la photo, afin de pouvoir affiché la "photo0"
func showPictures(atindex index: Int){
let photoName: String = “Photo(index - 1)” // !!!obligé de faire “index - 1” pour pouvoir afficher l’image “Photo0” !!!
_imageView.image = UIImage(named: photoName)
lblCount.text = "(index)/(TOTAL_PICTURES)"
currentPhotoIndex = index
}
Encore une fois, merci pour l’aide que vous m’apporterez

Bonjour BillyZeBlack,
Je viens de vérifier de mon coté pour ton premier problème et je pense que tu dois avoir une erreur sur l’intitulé de tes photos ou sur la variation de ton index.
Tu dois avoir 5 photos (d’ou ton TOTAL_PICTURES = 5) : photo0, photo1, photo2, photo3 et photo4. Ton index doit varier entre 0 et 4. Si il est >= 5 (TOTAL_PICTURES), il repart à 0.
Ah voila en lisant ton deuxième problème je vois ou ça cloche : c’est bien ton index je te met mon code pour que tu compares
import UIKit

var _timer:Timer?

class ViewController: UIViewController {

var _currentPhotoIndex:Int = 0
let TOTAL_PHOTO_COUNT:Int = 5

@IBOutlet weak var ui_imageView: UIImageView!
@IBOutlet weak var ui_counterLabel: UILabel!
@IBOutlet weak var ui_controlBar: UIView!

override func viewWillAppear(_ animated: Bool) {
    showPhoto(atIndex: _currentPhotoIndex)
    let shouldDisplayControls = UserDefaults.standard.bool(forKey: OptionsViewController.SLIDESHOW_CONTROLS_OPTION)
    ui_controlBar.isHidden = (shouldDisplayControls == false)
}

func SheduleNewTimer () {
    if let existingTimer:Timer = _timer {
        existingTimer.invalidate()
    }
    let interval = UserDefaults.standard.float(forKey: OptionsViewController.SLIDESHOW_DELAY_OPTION)
    _timer = Timer.scheduledTimer(timeInterval: TimeInterval(interval), target: self, selector: #selector(ViewController.showNextPhoto), userInfo: nil, repeats: false)
}

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

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func showPreviousPhoto() {
    var nextPhotoIndex:Int = _currentPhotoIndex - 1
    if nextPhotoIndex < 0 {
        nextPhotoIndex = TOTAL_PHOTO_COUNT - 1
    }
    showPhoto(atIndex: nextPhotoIndex)
}

@IBAction func showNextPhoto() {
    var nextPhotoIndex:Int = _currentPhotoIndex + 1
    if nextPhotoIndex >= TOTAL_PHOTO_COUNT {
        nextPhotoIndex = 0
    }
    showPhoto(atIndex: nextPhotoIndex)
}

func showPhoto(atIndex index:Int) {
    let photoName:String = "photo\(index)"
    ui_imageView.image = UIImage(named: photoName)
    ui_counterLabel.text = "\(index+1)/\(TOTAL_PHOTO_COUNT)"
    _currentPhotoIndex = index
    SheduleNewTimer()
}

@IBAction func displayOptions() {
}

}

si tu trouves pas donne moi ton code et je te dirais ou ça va pas. De mon coté j’ai juste mis +1 sur l’affichage du label des photos pour que ce soit marqué 1 à la photo0 (index 0 aussi)

2 « J'aime »

En effet j’allais répondre la même chose : l’index doit aller de 0 à 4 car les numéros de photos vont de 0 à 4.
En fait tes 2 problèmes sont liés, c’est parce que tu vas de 1 à 5 que tu es obligé d’enlever 1 au moment de charger l’image. Si tu n’enlèves pas le 1 alors tu ne verras jamais la photo 0 et tu auras une image vide pour la photo 5 car elle n’existe pas.

Sincerement je n’arrive pas à voir ou est ce que j’ai fait la boulette.
J’ai bien saisie le principe entre le nom de mes photos et l’incrémentation de l’index, mais ça ne colle pas chez moi :confused:
Voici mon code :
import UIKit

class ViewController: UIViewController {

    // Variables
    
    @IBOutlet weak var _imageView: UIImageView!
    @IBOutlet weak var lblCount: UILabel!
    
    let TOTAL_PICTURES: Int = 5
    var currentPhotoIndex: Int = 0
   
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
    }
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func nextPictures() {
        var nextPhotoIndex: Int = currentPhotoIndex + 1
        if nextPhotoIndex >= TOTAL_PICTURES {                    // !!! le ">=" m'empeche d'atteindre la derniere photo !!!
            nextPhotoIndex = 0
        }
        showPictures(atindex: nextPhotoIndex)
    }
    
    @IBAction func previewPicture() {
        var nextPhotoIndex: Int = currentPhotoIndex - 1
        if nextPhotoIndex < 0 {
            nextPhotoIndex = TOTAL_PICTURES - 1
        }
        showPictures(atindex: nextPhotoIndex)
    }
    
    func showPictures(atindex index: Int){
        let photoName: String = "Photo\(index)"          // !!!obligé de faire "index - 1" pour pouvoir afficher l'image "Photo0" !!!
        _imageView.image = UIImage(named: photoName)
        lblCount.text = "\(index + 1)/\(TOTAL_PICTURES)"
        // on incrémente la variable currentPhotoIndex en lui attribuant la valeur de la variable index
        currentPhotoIndex = index
    }
    
//
}

Dans ton code il manque le nécéssaire pour afficher la photo à l’apparition de la vue :

    override func viewWillAppear(_ animated: Bool) {
    showPhoto(atIndex: _currentPhotoIndex)
    let shouldDisplayControls = UserDefaults.standard.bool(forKey: OptionsViewController.SLIDESHOW_CONTROLS_OPTION)
    ui_controlBar.isHidden = (shouldDisplayControls == false)
}

Sinon le code à l’air bon

Merci Fabrice,
Pourrais tu s’il te plait m’expliquer l’instruction que tu attribut à la constante shouldDisplayControls ?
@mbritto, j’avoue que pour cet exercice j’étais partie dans un truc totalement farfelu du fait que je ne savais pas comment récupérer une photo présente dans le projet via le code. A quel moment du cours tu en parles, car j’ai vraiment pas vu cette partie là…

edit :
Je viens d’ajouter la fonction viewWillAppear, et tout fonctionne…
Par contre je crois que je vais reprendre à zéro, car il me manque des épisodes.

c’est expliqué dans l’étape 4 : Utiliser les réglages utilisateur à 6’50

2 « J'aime »

@fabrice.sirdey, je n’y suis pas encore… Comme toi, j’essaie dans un premier temps de trouver la solution de moi même… J’y viendrais forcement lol
En tout cas merci pour le coup de pouce

Je pense que l’un des meilleurs moyens de comprendre tes erreurs est de suivre la correction dans l’ordre des vidéos.
Normalement j’essaie d’expliquer au maximum pendant que je code donc si tu prends juste le fichier final tu risques d’être perdu

je comprends… Mais le but, je pense est de pouvoir trouver le maximum d’éléments par nous même… Du coup avant de regarder la vidéo, j’essaie, sans grand succès, mais bon…
Par contre je ne regarde que tes vidéos qui sont commentées. Je n’ai pas récupérer les projets finaux… Mais je crois, au vu des 3 heures qui viennent de s’écouler que je vais suivre les vidéos comme des tutos :’(

Ce que tu peux faire, dans ce cas là c’est regarder les vidéos, SANS CODER. L’objectif est uniquement de comprendre ce que je fais.
Ensuite, tu repars de 0 et tu recodes l’app sans regarder les vidéos

1 « J'aime »

C’est ce que je fais, enfin presque… Je viens de faire et refaire la premiere partie de l’appli… Ca commence à rentrer… Il est vrai qu’après coup, cette partie n’était pas très compliqué… Je vais suivre ton conseil à la lettre pour la suite…

1 « J'aime »

Bonjour à tous,
Étant donné que je suis nouveau sur le forum, et également débutant dans le langage Swift, je ne sais pas si je fais bien de poster sur le forum, ou si je devais faire un MP à Maxime. Vous m’en excuserez, si je n’ai pas choisi la bonne option…
J’ai tenté de faire le diaporama seul avant de voir la correction, mais j’avais quelques lacunes quant aux réglages dans la page des options. Du coup, j’ai commencé à regarder la correction jusqu’à obtenir un début de réponse, et j’ai re-continué seul… Je dois dire que ce cours de Maxime est vraiment super bien fait, toutes les explications sont claires, et les corrections adaptées (on n’est pas obligé de regarder la correction jusqu’au bout, pour pouvoir continuer en cas de blocage).

Dans la correction de Maxime, je vois qu’il définit deux valeurs d’index, une première correspondant à l’index courant, puis dans les fonctions previousPicture et nextPicture, une copie de l’index courant incrémentée ou décrémentée de 1.

Y a t’il un intérêt particulier à cela? Car cela oblige à réinitialiser lindex courant dans la fonction showPictures.

Pour ma part, je n’ai qu’un seul index défini au début, et que je fais évoluer dans les fonctions previous et next…

Il en est de même dans le optionsViewController, dans lequel Maxime redéfinit une variable userDefaults = UserDefaults.standard pour en extraire les valeurs d’initialisation du controlSwitch, et du delaySlider, alors qu’on peut le récupérer directement dans le UserDefaults.standard, non?
Merci pour votre patience de lecture :wink:

Salut tursyop,

Pour repondre à ta question je pense qu’en programmation il n’eiste pas de “façon” type de faire une tâche, l’etentiel etand d’arriver au bon resultat. Pour une seul tâche il peu y avoir des millier de possibilités et pour moi un bon developpeur est celui qui arrive à faire une tâche de manière simple. Donc si ton diaporama fonctionne correctement c’est que tu as compris les leçons,