意外地发现零,同时展开一个可选的值uitextfield
问题描述:
我知道这里有很多意想不到的值问题,但我尝试了其他方法,但他们不适合我。底部的功能是通过另一个视图控制器上的按钮调用的。基本上问题是这段代码按预期工作,表单元素具有DatePicker作为输入视图,并且当值更改时它更新startDatePickerField.text,所以我知道startDatePickerField.text不是空的,因为它显示在屏幕。但是,当调用testForValidity()函数从包含我们工作的另一个视图控制器调用时,我得到“意外地发现零,而解包选项值错误”。所有的网点连接正确,所以我知道不是这样。意外地发现零,同时展开一个可选的值uitextfield
class popoverTableViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet var startDatePickerField: UITextField!
override func viewDidLoad() {
let startDatePicker:UIDatePicker = UIDatePicker()
startDatePicker.datePickerMode = UIDatePickerMode.dateAndTime
startDatePickerField.inputView = startDatePicker
startDatePicker.minuteInterval = 5
startDatePicker.addTarget(self, action: #selector(popoverTableViewController.startDatePickerValueChanged(_:)), for: UIControlEvents.valueChanged)
}
@IBAction func startDateDidBegin(_ sender: AnyObject) {
}
func startDatePickerValueChanged(_ sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = DateFormatter.Style.long
dateFormatter.timeStyle = DateFormatter.Style.short
startDatePickerField.text = dateFormatter.string(from: sender.date)
finishDateTime = sender.date
}
这错误的功能:
func testForValidity() {
print(startDatePickerField.text)
}
答
问题:
- 您试图通过实例方法从另一个类访问IBOutlet属性。
- nil值背后的原因是IBOutlets在加载nib时初始化。
因此,在你的情况,当你在另一个视图控制器,你不能访问其他变量的插座,你将永远得到零。
解决方案:
如果我认为正确的,你要具有一个值后使用从视图控制器的值。
最好的方法是按照'设计模式'。即,您必须将所需的值存储在模型类中,并通过模型类实例访问该值。
苹果有很好的关于它的文档。请通过。 https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson6.html#//apple_ref/doc/uid/TP40015214-CH20-SW1
示例代码斯威夫特:
class TextFieldViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var outputLabel : UILabel!
@IBOutlet weak var textField : UITextField!
override func viewDidLoad() { super.viewDidLoad(); setupTextField() }
func testValidity() -> (textFieldValue: UITextField?, modelValue: String?) {
return (textField, TextFieldModel.sharedModel.textFieldData)
}
//MARK: - Text Field Delegates
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
outputLabel.text = textField.text
TextFieldModel.sharedModel.textFieldData = textField.text
return true
}
}
class TextFieldModel {
static let sharedModel = TextFieldModel()
var textFieldData: String?
}
class DemoController: UIViewController {
@IBOutlet weak var textFieldOutput: UILabel!
@IBOutlet weak var modelOutput: UILabel!
override func viewDidLoad() { super.viewDidLoad(); testValues() }
func testValues() {
let tvc = TextFieldViewController()
textFieldOutput.text = "Value of Text field is " + (tvc.testValidity().textFieldValue?.text ?? "nil")
modelOutput.text = "Value accessed from Model Class is \(tvc.testValidity().modelValue)"
}
}
extension TextFieldViewController {
func setupTextField() {
textField.placeholder = ""
textField.delegate = self
textField.becomeFirstResponder()
textField.keyboardType = UIKeyboardType.Default
textField.returnKeyType = UIReturnKeyType.Done
}
}
输出:
答
在顶部添加UITextFieldDelegate
所以它变成了:
class popoverTableViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
然后在viewDidLoad()
加入这一行:
self.startDatePickerField.delegate = self
哪里testForValidity()?在popoverTableViewController?你打电话过得怎么样? – Shades
testForValidity()在popoverTableViewController中是的,这是在按下按钮后从另一个类的简单调用。我意识到这个方法调用了我的popoverTableViewController的一个新实例,这就是为什么我得到错误。我认为修复与NSNotificationCentre有关,但我不确定如何实施它。 – user2662468