首页 > 解决方案 > 将数据传回另一个 ViewController 时为 Nil

问题描述

请告诉我,为什么我是零?我有 2 个控制器:MainViewControllerMililetersViewController. 在 中MainViewController,用户单击按钮并输入MililetersViewController,在那里他选择饮料的体积PickerView。此外,在同一个视图上,用户单击“添加”按钮,用户选择的数据应返回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
        }

    }

在这里我得到了零的错误:

@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)
        }
      }

我不明白零在哪里。请帮忙

标签: swiftxcode

解决方案


你不需要一个变量selectedRow

您可以访问pickerViewOutlet.selectedRow(inComponent: .zero)

并确保你的segues


推荐阅读