我在弄清楚代码混淆的地方遇到了麻烦。出于某种原因,当我单击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
尽量多睡一会儿;)