2017-01-06 22 views
0

以下のコードでは、日付ピッカーをテキストフィールドのサブビューとして実装しました。私はその機能についていません。 'verifyAge'。関数内のifステートメントは正常に動作しており、日付ピッカーの日付が指定した日付よりも上または下の場合にtextFieldの色が変更されます。しかしそれは対応する年にしか働くが、正確な日には働かない。私は過去2日間の検索を試みましたが、私の正確な問題の解決策を見つけることができませんでした。Date Picker Swiftからの年齢の計算3

let gregorian = Calendar(identifier: .gregorian) 
let ageComponents = gregorian.dateComponents([.year], from: dateOfBirth, to: Date()) 
let age = ageComponents.year! 

txtAgeConfirmation.textColor = age < 21 ? .red : .black 

それとも、時間にスウィフト3では

let ageComponents = calendar.dateComponents([.year], from: calendar.startOfDay(for: dateOfBirth), to: calendar.startOfDay(for: Date())) 

を無視したい場合は以下の質問と感嘆符は、ネイティブ使用してあります。

class AgeConfirmViewController: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var txtAgeConfirmation: UITextField! 
let datePicker: UIDatePicker = UIDatePicker() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    txtAgeConfirmation.delegate = self 
    createDatePicker() 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 
    txtAgeConfirmation.inputView = datePicker 
    datePicker.addTarget(self, action: #selector(self.datePickerChanged(sender:)), for: .valueChanged) 
} 



    func datePickerChanged(sender: UIDatePicker) { 
    let formatter = DateFormatter() 
    formatter.timeStyle = .none 
    formatter.dateStyle = .long 
    txtAgeConfirmation.text = formatter.string(from: sender.date) 
    verifyAge() 
} 


    func createDatePicker() { 
    datePicker.datePickerMode = .date 
    datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: 0, to: Date()) 
} 


func verifyAge() { 

    let dateOfBirth = datePicker.date 
    let today = Date() 
    let gregorian = NSCalendar(identifier: NSCalendar.Identifier.gregorian) 
    let age = gregorian?.components([.month, .day, .year], from: dateOfBirth, to: today, options:[]) 

     if (age?.year)! < 21 { 


     txtAgeConfirmation.textColor = UIColor.red 

    } else if (age?.year)! > 21 { 

     txtAgeConfirmation.textColor = UIColor.black 

    } 
} 
+0

この日までに必要な場合は、明確にしてください。意味は19歳11時59分の場合は20歳の肉はしません。あなたが今年に20歳になるだろうが、まだ20歳になっていない場合は、代わりにあなたが得ている。 – MwcsMac

+0

明らかになりました。 「それは対応する年にしか働くが、正確な日には働かない」。私はそれが正しい日であることを希望します。 – pjunior

+0

このコードを試してください:http://stackoverflow.com/questions/27182023/getting-the-difference-between-two-nsdates-in-months-days-hours-minutes-seconds –

答えて

3

シンプルなソリューション、daymonthを無視Calendar構造体。 yearの成分が明確に指定されているため、yearの後に記された年齢感嘆符は絶対に安全です。

+0

xcodeは感嘆符を付け加えました。私はこの質問を提出する前に1年しかいなかった。私は月と日がそれを解決するだろうと思ったが、それはしなかった。私はちょうどそれをもう一度変更し、問題はまだそれらです.. – pjunior

+0

私はあなたが期待している結果がわからない、私は代替案で答えを更新しました。 – vadian

+0

あなたが更新したコードを追加すると、私は 'startOfDay'から行方不明になりました。ありがとう – pjunior

関連する問題