Ios 在展开可选值uitextfield时意外发现nil
我知道这里有很多意想不到的零值问题,但我尝试过其他方法,它们对我不起作用。底部的函数是从另一个视图控制器上的按钮调用的。基本上,问题是这段代码按预期工作,表单元素将DatePicker作为输入视图,并且在值更改时更新startDatePickerField.text,因此我知道startDatePickerField.text在屏幕上显示时不是空的。但是,当从包含我们正在使用的视图控制器的另一个视图控制器调用testForValidity()函数时,我得到“在展开选项值错误时意外发现nil”。所有插座都连接正确,所以我知道不是这样Ios 在展开可选值uitextfield时意外发现nil,ios,swift,Ios,Swift,我知道这里有很多意想不到的零值问题,但我尝试过其他方法,它们对我不起作用。底部的函数是从另一个视图控制器上的按钮调用的。基本上,问题是这段代码按预期工作,表单元素将DatePicker作为输入视图,并且在值更改时更新startDatePickerField.text,因此我知道startDatePickerField.text在屏幕上显示时不是空的。但是,当从包含我们正在使用的视图控制器的另一个视图控制器调用testForValidity()函数时,我得到“在展开选项值错误时意外发现nil”。所
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)
}
在顶部,添加
UITextFieldDelegate
,使其成为:
class popoverTableViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
然后在viewDidLoad()中添加此行:
self.startDatePickerField.delegate = self
在顶部,添加UITextFieldDelegate
,使其成为:
class popoverTableViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
然后在viewDidLoad()中添加此行:
self.startDatePickerField.delegate = self
问题:
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
}
}
- 您正试图通过实例方法从另一个类访问IBOutlet属性
- nil值背后的原因是,当加载nib时,出口被初始化
因此,在您的情况下,当您在另一个视图控制器中时,您无法访问Outlet变量,否则您将始终得到nil
解决方案:
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
}
}
如果我假设正确,您希望在视图控制器中包含值后使用该值
最好的方法是遵循“设计模式”。i、 例如,您必须将所需的值存储在模型类中,并通过模型类实例访问该值
苹果有很好的文档。请通过。
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
}
}
输出:
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
}
}
问题:
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
}
}
- 您正试图通过实例方法从另一个类访问IBOutlet属性
- nil值背后的原因是,当加载nib时,出口被初始化
因此,在您的情况下,当您在另一个视图控制器中时,您无法访问Outlet变量,否则您将始终得到nil
解决方案:
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
}
}
如果我假设正确,您希望在视图控制器中包含值后使用该值
最好的方法是遵循“设计模式”。i、 例如,您必须将所需的值存储在模型类中,并通过模型类实例访问该值
苹果有很好的文档。请通过。
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
}
}
输出:
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
}
}
testForValidity()在哪里?在popoverTableViewController中?如何调用它?testForValidity()在popoverTableViewController中是的,它是在按下按钮后从另一个类进行的简单调用。我意识到这个方法调用了我的popoverTableViewController的一个新实例,这就是我出错的原因。我认为修复与NSNotificationCenter有关,但我不确定如何实现它。testForValidity()在哪里?在popoverTableViewController中?如何调用它?testForValidity()在popoverTableViewController中是的,它是在按下按钮后从另一个类进行的简单调用。我意识到这个方法调用了我的popoverTableViewController的一个新实例,这就是我出错的原因。我认为修复与NSNotificationCenter有关,但我不确定如何实现它。非常感谢您花时间回答,非常有魅力!不客气。很高兴我能帮你解决问题。非常感谢你花时间回答,真有魅力!不客气。很高兴我能帮你解决问题。