2017-05-15 6 views
0

Ich habe eine Szene, die eine Frage aus einem Array anzeigt. Das Storyboard enthält zwei Schaltflächen, um zur nächsten/vorherigen Frage zu gelangen. Ich habe eine Methode, die die Klasse mit den Fragen (Deck) nach dem aktuellen Kapitel, der aktuellen Frage und der Anzahl der Gesamtfragen fragt. Dies wird verwendet, um den Titel zu aktualisieren.Wie Zugriff Eigenschaften von Tasten von außerhalb einer Steckdose - Swift

Ich möchte meine updateTitle() -Funktion verwenden können, um den aktivierten Status meiner beiden Tasten steuern zu können - Deaktivieren der Schaltfläche "next", wenn die aktuelle Frage die letzte ist, und Deaktivieren der "vorherigen" Schaltfläche, wenn die erste Frage angezeigt wird.

Ich bin in der Lage, den Status eines Knopfes aus seinem Ausgang zu ändern, z.B. durch den Aufruf von sender.isEnable = false mit einer relevanten if-Anweisung. Das Problem dabei ist jedoch, dass wenn ein Benutzer auf den Punkt neben der Schaltfläche klickt, der Klick auf die vorherige Schaltfläche die Schaltfläche "next" nicht wieder aktiviert.

Was wäre ideal, um den Status der Schaltflächen innerhalb der Methode setTitle() zu setzen?

Das ist meine Klasse:

class QuestionController: UIViewController { 
    // OUTLETS ////// 
    // Outlet for the 'question' label 
    @IBOutlet weak var questionTextView: UITextView! 


    // Outlet for the next button 
    @IBAction func nextQuestion(_ sender: UIButton) { 
     flashcard = deck.getNextCard() 
     questionTextView.text = flashcard!.question 
     self.updateTitle() 

    } 

    // Outlet for last button 
    @IBAction func lastQuestion(_ sender: UIButton) { 
     flashcard = deck.getLastCard() 
     questionTextView.text = flashcard!.question 
     self.updateTitle() 
    } 

    // PROPERTIES ///// 

    var flashcard: Flashcard! // variable to hold current flashcard 
    var deck = Deck(chapter: 0) // Defaults to first chapter until set 


    // METHODS ////// 
    // Update the title with progress 
    private func updateTitle() { 
     let (chapter, question, totalQuestions) = deck.getProgress() 
     self.title = "Chapter \(chapter) question \(question) of \(totalQuestions)" 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     // Holds deck of data 
     flashcard = deck.getCurrentCard() 
     questionTextView.text = flashcard!.question 

     self.updateTitle() // Update the title with progress 
    } 

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



    // Prepare flashcard item to be passed to the answer controller before segue 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let answerController = segue.destination as? AnswerController { 
      answerController.flashcard = flashcard 
     } 
    } 

} 
+0

Wenn Sie auf die nächste und vorherige Schaltfläche klicken, überprüfen Sie die Anzahl der Fragen, wenn es die letzte deaktiviert, und wenn der Startindex ist, dann deaktivieren Sie vorher. –

Antwort

0

Nehmen Sie Ausgang der Taste verwenden. So etwas: -

class QuestionController: UIViewController { 

    @IBOutlet weak var questionTextView: UITextView! 
    @IBOutlet weak var btnNext: UIButton! 
} 
+0

Ich versuchte das durch Kontrolle Klick von der Schaltfläche auf die Klasse, um zu versuchen und eine Var Steckdose zu erstellen, aber es würde mich nicht lassen, ich dachte, dies könnte sein, weil ich bereits eine func outlet für die Taste (um die Aktionen für die Taste)? – laurie

+0

Die Instanz der Schaltfläche wird in Aktion und Ausgang beide gleich sein. –

0

Dank konnte ich die Ausgänge am Ende erstellen. Ich aktualisierte dann die updateTitle() -Methode mit der unten stehenden if-Anweisung, die den Status der Schaltfläche an den relevanten Punkten aktualisiert.

// 
// ViewController.swift 
// CISSP Flashcards 
// 
// Created by Laurie Hocking on 24/04/2017. 
// Copyright © 2017 sQuidgy labs. All rights reserved. 
// 

import UIKit 

class QuestionController: UIViewController { 
    // OUTLETS ////// 
    // Outlet for the 'question' label 
    @IBOutlet weak var questionTextView: UITextView! 
    @IBOutlet weak var nextOutlet: UIButton! 
    @IBOutlet weak var lastOutlet: UIButton! 

    @IBOutlet weak var nextQuestion: UIButton! 
    // Outlet for the next button 
    @IBAction func nextQuestion(_ sender: UIButton) { 
     flashcard = deck.getNextCard() 
     questionTextView.text = flashcard!.question 
     self.updateTitle() 

    } 

    // Outlet for last button 
    @IBAction func lastQuestion(_ sender: UIButton) { 
     flashcard = deck.getLastCard() 
     questionTextView.text = flashcard!.question 
     self.updateTitle() 
    } 

    // PROPERTIES ///// 

    var flashcard: Flashcard! // variable to hold current flashcard 
    var deck = Deck(chapter: 0) // Defaults to first chapter until set 


    // METHODS ////// 
    // Update the title with progress 
    private func updateTitle() { 
     let (chapter, question, totalQuestions) = deck.getProgress() 
     self.title = "Chapter \(chapter) question \(question) of \(totalQuestions)" 
     if (question == 1) { 
      lastOutlet.isEnabled = false 
      nextOutlet.isEnabled = true 
     } else if (question == totalQuestions) { 
      lastOutlet.isEnabled = true 
      nextOutlet.isEnabled = false 
     } else { 
      lastOutlet.isEnabled = true 
      nextOutlet.isEnabled = true 
     } 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     // Holds deck of data 
     flashcard = deck.getCurrentCard() 
     questionTextView.text = flashcard!.question 

     self.updateTitle() // Update the title with progress 
    } 

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



    // Prepare flashcard item to be passed to the answer controller before segue 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let answerController = segue.destination as? AnswerController { 
      answerController.flashcard = flashcard 
     } 
    } 

} 
Verwandte Themen