Есть ли способ написать оператор if, основанный на том, была ли ранее нажата кнопка на другом контроллере представления? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь создать калькулятор, который отображает пользователю результаты об их оценках в колледже.Пользователь нажимает кнопки и в зависимости от их выбора пользовательский интерфейс обновляется и отображает следующий вопрос.Мой код работает до тех пор, пока мне не понадобится доступ к ранее нажатой кнопке, которая была выбрана ранее и на другом контроллере представления.Проблема, с которой я столкнулся, заключается в одном контроллере представления, который пользователь может выбрать, если он хочет знать Calculation1 (связанный с верхней кнопкой с sender.tag == 1) или Calculation2 (нижнюю кнопку, sender.tag == 2).Независимо от того, какая кнопка нажата, выполняется переход к тому же вопросу на новом контроллере представления.После ответа на этот взаимный вопрос остается нажать только одну кнопку.Я пытаюсь закодировать оператор if, если был выбран Calculation1 (из предыдущего VC), затем обновить представление до следующего вопроса, и, если было выбрано Calculation2, выполнить переход к другому VC для следующего вопроса.То, как я пытался использовать логическое значение, было свойством предыдущего VC.Оператор if не работает, и вместо этого одно и то же действие происходит независимо от выбора.

Это для приложения iOS со Swift с использованием Xcode.Я попытался создать логическое значение как свойство, чтобы при нажатии «Вычисление1» findCalc1 = true, а затем доступ к этому логическому значению в качестве свойства в следующем VC, но это не сработало.Я также пытался подготовить логическое значение для перехода к взаимному вопросу, но это тоже не сработало.Я чувствую, что у меня есть пробел в моем понимании того, что может и не может быть выполнено между различными VC.

// Вот мой код для первого VC

@IBAction func lightButtonPressed(_ sender: UIButton) {

        if sender.tag == 1 && lightViewPromptIndex == 1 {

            desiredGpaText = textfield.text!
            performSegue(withIdentifier: "goToDarkButtonVC", sender: self)

           } else if sender.tag == 2 && lightViewPromptIndex == 1 {

            performSegue(withIdentifier: "goToDarkButtonVC", sender: self)

        }

// Вотмой код для второго ВК

@IBAction func darkButtonPressed(_ sender: Any) {

    if aboveTopPromptIndex == 1 && lightViewObject().findCalc1 == true {
        aboveTopTextPrompt.text = aboveTopPrompt2
        topTextfield.placeholder = "Ex: 76.00"
        besideTopTextLabel.isHidden = true
        underTopTextLabel.text = "course credits"
        aboveBottomTextPrompt.text = "that count toward my GPA."
        bottomTextfield.isHidden = true
        underBottomTextLabel.isHidden = true
        bottomFloatingLabel.isHidden = true
        darkButton.setTitle(nextTitle, for: .normal)
        aboveTopPromptIndex = 2
    } else if aboveTopPromptIndex == 1 && lightViewObject().findCalc1 == false {
        performSegue(withIdentifier: "darkViewToABC", sender: TextfieldTwoLightButtonsViewController.self)

В общем вопросе есть aboveTopPromptIndex == 1.Я хотел бы, чтобы этот вопрос задавался и если ранее был выбран Calculation1, для запуска первого куска кода в операторе if ... и, если требуется Calculation2, для перехода в оператор else if.Вместо этого, независимо от того, какая кнопка нажата, выполняется первая часть оператора if независимо от того, был ли выбран Calculation2 ранее.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Эта проблема связана с передачей данных из одного контроллера представления в другой контроллер представления. Для передачи данных из одного контроллера представления в В другом контроллере вида вы можете использовать методы segue

func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { }

Usage:

Добавление расширения к первому контроллеру представления, т.е. к вашему lightViewController

extension lightViewController {

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
        if (segue.identifier == "goToDarkButtonVC") {
            let destVC = segue.destinationViewController as! darkViewController
            destVC. findCalc = sender as! Bool
        }
    }
    @IBAction func lightButtonPressed(_ sender: UIButton) {

         if sender.tag == 1 && lightViewPromptIndex == 1 {

             desiredGpaText = textfield.text!
             // In the sender set the value as per your need....
             performSegue(withIdentifier: "goToDarkButtonVC", sender: true)

         } else if sender.tag == 2 && lightViewPromptIndex == 1 {
              // In the sender set the value as per your need....
              performSegue(withIdentifier: "goToDarkButtonVC", sender: true)
        }
    }
}

На вашем втором контроллере представления доступ к значению, как это:

class darkViewController : UIViewController {
    var findCalc = false 
    @IBAction func darkButtonPressed(_ sender: Any) {

        if aboveTopPromptIndex == 1 && self.findCalc1 == true {
          //TODO: add your handling code here....
        }
}

И вот как вы можете легко выполнить ваши требования.

0 голосов
/ 22 января 2019

Создание нового объекта lightViewObject () создаст новый блок памяти и не будет содержать значений, сохраненных в предыдущем viewController

Использование Подготовка к передаче для передачи данных от одного контроллера представления к другому

class lightViewController : UIViewController {

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
        if (segue.identifier == "goToDarkButtonVC") {
            let destVC = segue.destinationViewController as! darkViewController
            destVC.findCalc1 = true // change the value here
        }
    }
    @IBAction func lightButtonPressed(_ sender: UIButton) {

         if sender.tag == 1 && lightViewPromptIndex == 1 {

             desiredGpaText = textfield.text!
             performSegue(withIdentifier: "goToDarkButtonVC", sender: self)

         } else if sender.tag == 2 && lightViewPromptIndex == 1 {

              performSegue(withIdentifier: "goToDarkButtonVC", sender: self)
        }
    }
}

Затем используйте значение в darkViewController

class darkViewController : UIViewController {
    var findCalc1:Bool = false 
    @IBAction func darkButtonPressed(_ sender: Any) {

        if aboveTopPromptIndex == 1 && self.findCalc1 == true {
           //Your Code here
        }
}
...