swift - 将数据传回另一个 ViewController 时为 Nil
问题描述
请告诉我,为什么我是零?我有 2 个控制器:MainViewController
和MililetersViewController
. 在 中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)
}
}
我不明白零在哪里。请帮忙
解决方案
你不需要一个变量selectedRow
您可以访问pickerViewOutlet.selectedRow(inComponent: .zero)
并确保你的segues
推荐阅读
- angular - 在 Ionic 应用程序中从模式导航到页面时如何更新数组?
- kotlin - Enum::valueOf 在哪里定义?
- c - 使用 void 指针:0xC0000005:访问冲突读取位置
- c - CS50 Pset2 可读性中的错误输出
- c++ - 默认构造函数和 void 构造函数有什么不同
- xml - 使用 XSL 交叉引用来计算匹配节点
- flutter - Flutter如何按1个值过滤数据?
- java - 如何识别项目(eclipse)类型(RCP或其他)来查看代码?
- amazon-web-services - 从 KMS 加密 SNS 中的 lambda 函数发布
- javascript - 在一条线上推动和取消移动是行不通的。我究竟做错了什么?