2016-07-30 33 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 
相關問題