gpt4 book ai didi

ios - 在展开可选值 uitextfield 时意外发现 nil

转载 作者:搜寻专家 更新时间:2023-11-01 06:05:36 26 4
gpt4 key购买 nike

我知道这里有很多意想不到的零值问题,但我尝试了其他方法,但它们对我不起作用。底部的函数是从另一个 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 值背后的原因是 IBOutlets 在加载 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

}
}

输出:

enter image description here

关于ios - 在展开可选值 uitextfield 时意外发现 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38675532/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com