DatePicker显示在多个文本字段中



我在弄清楚代码混淆的地方遇到了麻烦。出于某种原因,当我单击textFieldStartTime或textFieldEndtime时,它们在两者中都发生变化,以及在textFieldDDate中更改日期。

任何帮助都是感激的。

Extension.swift

import Foundation
extension NSDate{
var stringValue: String{
    return self.toString()
}
func toString() -> String {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "yyyy-MMM-dd"
    let str = formatter.stringFromDate(self)
    return str
}
}
extension String{
var dateValue: NSDate?{
    return self.toDate()
}
func toDate() -> NSDate? {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "yyyy-MMM-dd"
    if let date = formatter.dateFromString(self) {
        return date
    }else{
        // if format failed, Put some code here
        return nil // an example
    }
}
}
extension NSDate{
var starttimestringValue: String{
    return self.tostarttimeString()
}
func tostarttimeString() -> String {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "HH:mm"
    let str = formatter.stringFromDate(self)
    return str
}
}
extension String{
var starttimedateValue: NSDate?{
    return self.tostarttimeDate()
}
func tostarttimeDate() -> NSDate? {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "HH:mm"
    if let date = formatter.dateFromString(self) {
        return date
    }else{
        // if format failed, Put some code here
        return nil // an example
    }
}
}
extension NSDate{
var endtimestringValue: String{
    return self.toendtimeString()
}
func toendtimeString() -> String {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "HH:mm"
    let endstr = formatter.stringFromDate(self)
    return endstr
}
}
extension String{
var endtimedateValue: NSDate?{
    return self.toendtimeDate()
}
func toendtimeDate() -> NSDate? {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "HH:mm"
    if let date = formatter.dateFromString(self) {
        return date
    }else{
        // if format failed, Put some code here
        return nil // an example
    }
}
}

AddDiveLogViewController.swift

import UIKit
import CoreData
class AddDiveLogViewController: UIViewController {

@IBOutlet weak var textFieldDiveNumber: UITextField!
@IBOutlet weak var textFieldDiveLocation: UITextField!
@IBOutlet weak var textFieldDDate: UITextField!
@IBOutlet weak var textFieldStartTime: UITextField!
@IBOutlet weak var textFieldEndTime: UITextField!
var divenumber: String = ""
var divelocation: String = ""
var ddate = NSDate()
var starttime = NSDate()
var endtime = NSDate()
var datePickerView: UIDatePicker!
var timePickerView: UIDatePicker!
var endtimePickerView: UIDatePicker!
var existingItem: NSManagedObject!
override func viewDidLoad() {
    super.viewDidLoad()
    if (existingItem != nil) {
        textFieldDiveNumber.text = divenumber
        textFieldDiveLocation.text = divelocation
        textFieldDDate.text = ddate.stringValue
        textFieldStartTime.text = starttime.starttimestringValue
        textFieldEndTime.text = endtime.endtimestringValue
                }
    // Do any additional setup after loading the view.
    // This sets up the Date Picker
    datePickerView = UIDatePicker()
    datePickerView.datePickerMode = UIDatePickerMode.Date

    var toolbar = UIToolbar(frame: CGRectMake(0, 0, datePickerView.frame.width, 44))
    let OKButton = UIBarButtonItem(title: "OK", style: .Plain, target: self, action: "OKButtonTapped:")
    toolbar.setItems([OKButton], animated: true)
    self.textFieldDDate.inputView = datePickerView
    self.textFieldDDate.inputAccessoryView = toolbar
    // This sets up the Time Picker
    timePickerView = UIDatePicker()
    timePickerView.datePickerMode = UIDatePickerMode.Time

    var timetoolbar = UIToolbar(frame: CGRectMake(0, 0, timePickerView.frame.width, 44))
    let TimeOKButton = UIBarButtonItem(title: "OK", style: .Plain, target: self, action: "OKButtonTapped:")
    timetoolbar.setItems([TimeOKButton], animated: true)
    self.textFieldStartTime.inputView = timePickerView
    self.textFieldStartTime.inputAccessoryView = timetoolbar
    // This sets up the End Time Picker
    endtimePickerView = UIDatePicker()
    endtimePickerView.datePickerMode = UIDatePickerMode.Time

    var endtimetoolbar = UIToolbar(frame: CGRectMake(0, 0, endtimePickerView.frame.width, 44))
    let endTimeOKButton = UIBarButtonItem(title: "OK", style: .Plain, target: self, action: "OKButtonTapped:")
    endtimetoolbar.setItems([endTimeOKButton], animated: true)
    self.textFieldStartTime.inputView = endtimePickerView
    self.textFieldStartTime.inputAccessoryView = endtimetoolbar


}
@IBAction func saveTapped(sender: AnyObject) {
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let contxt: NSManagedObjectContext = appDel.managedObjectContext!
    let en = NSEntityDescription.entityForName("Divelog", inManagedObjectContext: contxt)
    if (existingItem != nil) {
        existingItem.setValue(textFieldDiveNumber.text, forKey: "divenumber")
        existingItem.setValue(textFieldDiveLocation.text, forKey: "divelocation")
        existingItem.setValue(textFieldDDate.text.dateValue!, forKey: "ddate")
        existingItem.setValue(textFieldStartTime.text.starttimedateValue!, forKey: "starttime")
        existingItem.setValue(textFieldEndTime.text.endtimedateValue!, forKey: "endtime")
    } else {
        var newItem = Divelog(entity: en!, insertIntoManagedObjectContext: contxt)
        newItem.divenumber = textFieldDiveNumber.text
        newItem.divelocation = textFieldDiveLocation.text
        newItem.ddate = textFieldDDate.text.dateValue!
        newItem.starttime = textFieldStartTime.text.starttimedateValue!
        newItem.endtime = textFieldEndTime.text.endtimedateValue!
    }

    contxt.save(nil)
    self.navigationController?.popToRootViewControllerAnimated(true)
}
@IBAction func cancelTapped(sender: AnyObject) {
    self.navigationController?.popToRootViewControllerAnimated(true)
}
func OKButtonTapped(sender: UIBarButtonItem) {
    self.textFieldDDate.endEditing(true)
    self.textFieldDDate.text = datePickerView.date.stringValue
    self.textFieldStartTime.endEditing(true)
    self.textFieldStartTime.text = timePickerView.date.starttimestringValue
    self.textFieldEndTime.endEditing(true)
    self.textFieldEndTime.text = endtimePickerView.date.endtimestringValue
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

您的代码中有一个错误。你已经设置了结束时间选择器textfieldstarttimetextfield:

self.textFieldStartTime.inputView
self.textFieldStartTime.inputAccessoryView

所以,不用

// This sets up the End Time Picker
    endtimePickerView = UIDatePicker()
    endtimePickerView.datePickerMode = UIDatePickerMode.Time

    var endtimetoolbar = UIToolbar(frame: CGRectMake(0, 0, endtimePickerView.frame.width, 44))
    let endTimeOKButton = UIBarButtonItem(title: "OK3", style: .Plain, target: self, action: "OK3ButtonTapped:")
    endtimetoolbar.setItems([endTimeOKButton], animated: true)
    self.textFieldStartTime.inputView = endtimePickerView
    self.textFieldStartTime.inputAccessoryView = endtimetoolbar

你应该有:

// This sets up the End Time Picker
    endtimePickerView = UIDatePicker()
    endtimePickerView.datePickerMode = UIDatePickerMode.Time

    var endtimetoolbar = UIToolbar(frame: CGRectMake(0, 0, endtimePickerView.frame.width, 44))
    let endTimeOKButton = UIBarButtonItem(title: "OK", style: .Plain, target: self, action: "OKButtonTapped:")
    endtimetoolbar.setItems([endTimeOKButton], animated: true)
    self.textFieldEndTime.inputView = endtimePickerView
    self.textFieldEndTime.inputAccessoryView = endtimetoolbar

应该能行

第三个问题的答案…

你的OKButton, TimeOKButton, endTimeOKButton触发相同的动作okbuttontap。

在okbuttontap函数中,您初始化日期/开始时间和结束时间值。问题是UIDatePicker的不同实例与每个textField inputView相关联。

所以每次触发okbuttontapping时,你将textField值与每个UIDatePicker关联,即当你选择开始时间时,结束时间将与当前日期/时间关联(反之亦然)。

我的简单建议是为每个按钮设置三个不同的动作:

override func viewDidLoad() {
    super.viewDidLoad()
    if (existingItem != nil) {
        textFieldDiveNumber.text = divenumber
        textFieldDiveLocation.text = divelocation
        textFieldDDate.text = ddate.stringValue
        textFieldStartTime.text = starttime.starttimestringValue
        textFieldEndTime.text = endtime.endtimestringValue
                }
    // Do any additional setup after loading the view.
    // This sets up the Date Picker
    datePickerView = UIDatePicker()
    datePickerView.datePickerMode = UIDatePickerMode.Date

    var toolbar = UIToolbar(frame: CGRectMake(0, 0, datePickerView.frame.width, 44))
    let OKButton = UIBarButtonItem(title: "OK", style: .Plain, target: self, action: "OK1ButtonTapped:")
    toolbar.setItems([OKButton], animated: true)
    self.textFieldDDate.inputView = datePickerView
    self.textFieldDDate.inputAccessoryView = toolbar
    // This sets up the Time Picker
    timePickerView = UIDatePicker()
    timePickerView.datePickerMode = UIDatePickerMode.Time

    var timetoolbar = UIToolbar(frame: CGRectMake(0, 0, timePickerView.frame.width, 44))
    let TimeOKButton = UIBarButtonItem(title: "OK", style: .Plain, target: self, action: "OK2ButtonTapped:")
    timetoolbar.setItems([TimeOKButton], animated: true)
    self.textFieldStartTime.inputView = timePickerView
    self.textFieldStartTime.inputAccessoryView = timetoolbar
    // This sets up the End Time Picker
    endtimePickerView = UIDatePicker()
    endtimePickerView.datePickerMode = UIDatePickerMode.Time

    var endtimetoolbar = UIToolbar(frame: CGRectMake(0, 0, endtimePickerView.frame.width, 44))
    let endTimeOKButton = UIBarButtonItem(title: "OK", style: .Plain, target: self, action: "OK3ButtonTapped:")
    endtimetoolbar.setItems([endTimeOKButton], animated: true)
    self.textFieldEndTime.inputView = endtimePickerView
    self.textFieldEndTime.inputAccessoryView = endtimetoolbar
}

那么你将有三个不同的函数:

func OK1ButtonTapped(sender: UIBarButtonItem) {
    self.textFieldDDate.endEditing(true)
    self.textFieldDDate.text = datePickerView.date.stringValue
}
func OK2ButtonTapped(sender: UIBarButtonItem) {
    self.textFieldStartTime.endEditing(true)
    self.textFieldStartTime.text = timePickerView.date.starttimestringValue        
}
func OK3ButtonTapped(sender: UIBarButtonItem) {
    self.textFieldEndTime.endEditing(true)
    self.textFieldEndTime.text = endtimePickerView.date.endtimestringValue        
}

这似乎是多余的,但它不是,因为最后,每个按钮都包含在不同的InputView和DatePicker中。

好的,我检查了你的项目,我发现了另一个bug(最后一个?

)。

在DiveLogTableViewController.swift prepareForSegue函数中,你忘了从CoreData中设置starttime和endtime。

    ADLVC.divenumber = selectedItem.valueForKey("divenumber") as! String
    ADLVC.ddate = selectedItem.valueForKey("ddate") as! NSDate
    ADLVC.divelocation = selectedItem.valueForKey("divelocation") as! String
    // I added this, and it works fine...
    ADLVC.starttime = selectedItem.valueForKey("starttime") as! NSDate
    ADLVC.endtime = selectedItem.valueForKey("endtime") as! NSDate

尽量多睡一会儿;)

最新更新