Nil при передаче данных обратно другому ViewController - PullRequest
1 голос
/ 16 июня 2020

скажите, пожалуйста, почему у меня ноль? У меня 2 контроллера: MainViewController и MililetersViewController. В MainViewController пользователь нажимает кнопку и вводит MililetersViewController, где он выбирает объем напитка в PickerView. Далее, в том же представлении пользователь нажимает кнопку «Добавить», и данные, выбранные пользователем, должны go вернуться в MainViewController и записать в label.text

MainViewController код:

class MainViewController: UIViewController, MililetersVCDelegate {
    var selectedVolume = ""

    @IBOutlet weak var resultValue: UILabel!
    @IBOutlet weak var currentValue: UILabel!

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.navigationItem.title = "Main"
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationController?.isNavigationBarHidden = true
        self.tabBarController?.navigationItem.hidesBackButton = true
        DispatchQueue.main.async {
            self.resultValue.text = UserSettings.result
            UserDefaults.standard.synchronize()
        }
    }

      @IBAction func unwindToMainVC(segue:UIStoryboardSegue) {}

    func passingDataBack(withString: String) {
        self.currentValue.text = withString
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = segue.destination as? MililetersViewController
        vc?.proto = self 
    }

}

MililetersViewConrtoller код:

import UIKit

protocol MililetersVCDelegate {
    func passingDataBack(withString: String)
}

class MililetersViewController: UIViewController, UIViewControllerTransitioningDelegate {
    @IBOutlet weak var pickerViewOutlet: UIPickerView!
    @IBOutlet weak var addButtonOutlet: UIButton!

    var selectedVolume = ""
    var volume = MilimetersScreen()
    var proto: MililetersVCDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()

        pickerViewOutlet.dataSource = self
        pickerViewOutlet.delegate = self
        self.transitioningDelegate = self

    }


    @IBAction func goToMainVC(_ sender: UIButton) {
        proto.passingDataBack(withString: selectedVolume) // ERROR: Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

        performSegue(withIdentifier: K.BackToMainView, sender: self)
    }
  }

extension MililetersViewController: UIPickerViewDelegate, UIPickerViewDataSource {


        func numberOfComponents(in pickerView: UIPickerView) -> Int {
             return 1
        }

        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return volume.volumeArray.count
        }

        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
            return String(volume.volumeArray[row]) + " " + "ml"
        }

        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            selectedVolume = String(volume.volumeArray[row])
            print(selectedVolume) // Here I see that the number from the array and pickerView are written into the variable
        }

        func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
            return 35
        }

    }

Здесь я получаю ошибку, что там nil:

@IBAction func goToMainVC (_ sender: UIButton) {
            proto.passingDataBack (withString: selectedVolume) // ERROR: Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

            performSegue (withIdentifier: K.BackToMainView, sender: self)
        }
      }

Я не понимаю, где nil . Пожалуйста, помогите

1 Ответ

0 голосов
/ 16 июня 2020

Вам не нужна переменная для selectedRow

Вы можете получить доступ с помощью pickerViewOutlet.selectedRow(inComponent: .zero)

и убедитесь, что ваши сегменты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...