Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在展开可选值uitextfield时意外发现nil_Ios_Swift - Fatal编程技术网

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

Ios 在展开可选值uitextfield时意外发现nil,ios,swift,Ios,Swift,我知道这里有很多意想不到的零值问题,但我尝试过其他方法,它们对我不起作用。底部的函数是从另一个视图控制器上的按钮调用的。基本上,问题是这段代码按预期工作,表单元素将DatePicker作为输入视图,并且在值更改时更新startDatePickerField.text,因此我知道startDatePickerField.text在屏幕上显示时不是空的。但是,当从包含我们正在使用的视图控制器的另一个视图控制器调用testForValidity()函数时,我得到“在展开选项值错误时意外发现nil”。所

我知道这里有很多意想不到的零值问题,但我尝试过其他方法,它们对我不起作用。底部的函数是从另一个视图控制器上的按钮调用的。基本上,问题是这段代码按预期工作,表单元素将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有关,但我不确定如何实现它。非常感谢您花时间回答,非常有魅力!不客气。很高兴我能帮你解决问题。非常感谢你花时间回答,真有魅力!不客气。很高兴我能帮你解决问题。