【问题标题】:DatePicker showing up in multiple textfieldsDatePicker 出现在多个文本字段中
【发布时间】:2015-07-27 15:40:21
【问题描述】:

我无法找出代码混淆的地方。出于某种原因,当我单击 textFieldStartTime 或 textFieldEndtime 时,它​​们会同时更改以及更改 textFieldDDate 中的日期。

感谢任何帮助。

扩展.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.
}




}

【问题讨论】:

  • 我不完全理解你,但是当你调用/单击 func OKButtonTapped(你缺少@IBAction!)时,你设置了 textFieldDate、textFieldStartTime 和 textFieldEndTime
  • 这些文件在没有 IBAction 的情况下保存到 coredata 中,当我只有 textFieldDDate 时我不需要它,它只是保存日期,但是当我添加 textFieldStartTime 和 textFieldEndTime 时,我不断将它们与每个其他。文件可以在这里找到dropbox.com/sh/1z73s5c81yau2lz/AAA-14uz94AXku4DthTEaHLza?dl=0

标签: ios core-data nsdate


【解决方案1】:

您的代码中存在错误。您已经使用 textFieldStartTime textField 设置了结束时间选择器:

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

它应该可以工作。

【讨论】:

  • Opps,对不起,我之前确实改变了它。问题似乎是当我调用 tableViewCell 并且事情恢复到当前日期和时间时
【解决方案2】:

好的,第三个错误的第三个答案...

你的OKButton、TimeOKButton、endTimeOKButton触发同样的动作OKButtonTapped。

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

因此,每次触发 OKButtonTapped 时,都会将 textField 值与每个 UIDatePicker 相关联,即当您选择开始时间时,结束时间将与当前日期/时间相关联(反之亦然)。

我的简单建议是为每个 Button 设置三个不同的操作:

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 中。

【讨论】:

  • 在 let TimeOKButton 和 let endTimeOKButton 代码中出现“定义与先前值冲突”的错误
  • 完全有效。谢谢您的帮助。我想我现在要睡觉了。
【解决方案3】:

好的,我检查了您的项目,发现了另一个错误(最后一个?;))。

在 DiveLogTableViewController.swift prepareForSegue 函数中,您忘记从 CoreData 设置开始时间和结束时间。

    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

尽量多睡;)

【讨论】:

  • 几乎,当我从 TableViewCell 进入 ViewController 时,我仍然会得到更改。日期和时间不断变化。我需要能够添加不同的日期和开始时间以及残局。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多