我知道这里有很多意想不到的零值问题,但我尝试过其他方法,但它们对我不起作用。底部的函数是从另一个 View Controller 上的按钮调用的。基本上问题是此代码按预期工作,表单元素将 DatePicker 作为输入 View ,并且当值更改时它会更新 startDatePickerField.text ,所以我知道 startDatePickerField.text 不为空,因为它显示在屏幕。但是,当从包含我们正在使用的 View Controller 的另一个 View Controller 调用 testForValidity() 函数时,我收到“展开选项值错误时意外发现 nil”。所有 socket 均已正确连接,所以我知道事实并非如此。
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 值背后的原因是 IBOutlet 在 Nib 加载时初始化。
因此,在您的情况下,当您位于另一个 View Controller 中时,您无法访问 Outlet 变量,否则您将始终得到nil。
解决方案:
如果我假设正确,您希望在 View Controller 中有一个值后使用它的值。
最好的方法是遵循“设计模式”。即,您必须将所需的值存储在模型类中,并通过模型类实例访问该值。
Apple 有非常好的相关文档。请通过。 https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson6.html#//apple_ref/doc/uid/TP40015214-CH20-SW1
Swift 中的示例代码:
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
}
}
输出:
关于ios - 展开可选值 uitextfield 时意外发现 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38675532/