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

标签 ios swift

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

    }
}

输出:

enter image description here

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

相关文章:

objective-c - 在 iOS 上使用 Dropbox API 中的 Delta

ios - 将按钮图像设置为 setSelected

ios - 在 ViewController 上显示 SVProgressHUD?

SWIFT - OperationQueue.main.addOperation 和 DispatchQueue.main.async 之间有什么区别?

混合 CoreAudio 和 OpenAL 代码时,iOS 麦克风采样在设备上不起作用

iphone - 如何在 iPhone 中放大和缩小 TextView ?

ios - 多个命令产生与信息 plist 错误相关的路径

ios - UITableViewController VS UICollectionView

ios - xib 中的自定义 View 不起作用

ios - Swift:从解析中检索数据编号并计算平均值