2016-07-30 112 views
0

我知道这里有很多意想不到的值问题,但我尝试了其他方法,但他们不适合我。底部的功能是通过另一个视图控制器上的按钮调用的。基本上问题是这段代码按预期工作,表单元素具有DatePicker作为输入视图,并且当值更改时它更新startDatePickerField.text,所以我知道startDatePickerField.text不是空的,因为它显示在屏幕。但是,当调用testForValidity()函数从包含我们工作的另一个视图控制器调用时,我得到“意外地发现零,而解包选项值错误”。所有的网点连接正确,所以我知道不是这样。意外地发现零,同时展开一个可选的值uitextfield

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) 

} 
+0

哪里testForValidity()?在popoverTableViewController?你打电话过得怎么样? – Shades

+0

testForValidity()在popoverTableViewController中是的,这是在按下按钮后从另一个类的简单调用。我意识到这个方法调用了我的popoverTableViewController的一个新实例,这就是为什么我得到错误。我认为修复与NSNotificationCentre有关,但我不确定如何实施它。 – user2662468

回答

4

问题:

  • 您试图通过实例方法从另一个类访问IBOutlet属性。
  • nil值背后的原因是IBOutlets在加载nib时初始化。

因此,在你的情况,当你在另一个视图控制器,你不能访问其他变量的插座,你将永远得到

解决方案:

如果我认为正确的,你要具有一个值后使用从视图控制器的值。

最好的方法是按照'设计模式'。即,您必须将所需的值存储在模型类中,并通过模型类实例访问该值。

苹果有很好的关于它的文档。请通过。 https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson6.html#//apple_ref/doc/uid/TP40015214-CH20-SW1

示例代码斯威夫特:

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

+0

非常感谢您抽出宝贵的时间来回答问题! – user2662468

+0

不客气。很高兴我可以帮你解决问题。 – Tesan3089

+0

非常有用的信息。谢谢! – Quins

0

在顶部添加UITextFieldDelegate所以它变成了:

class popoverTableViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate { 

然后在viewDidLoad()加入这一行:

self.startDatePickerField.delegate = self 
相关问题