【问题标题】:Swift - load initial data from mysql into uidatepicker (not from a simple uipiker)Swift - 将初始数据从 mysql 加载到 uidatepicker(不是来自简单的 uipiker)
【发布时间】:2018-02-22 12:28:35
【问题描述】:

如何将数据从 mysql 加载到pickerdate?

就像现在一样,我可以在每个文本文件上加载正确的数据。问题是:uidatepicker 只记得 1 个值,它不会加载另一个值。

在图片中,我显示当单击 Date of Issue 文本字段时,它会在 pickerView 上显示 Due Date 的值。正确的应该是:2000 年 12 月 25 日

Milan 帮助我创建了选择日期,使用相同的功能 ==> link to the question

视图控制器

import UIKit
class InvoiceViewController: UIViewController, AccessoryToolbarDelegate {

var thePicker = UIDatePicker()

@IBOutlet weak var dateIssueTextField: UITextField!
@IBOutlet weak var dueDateTextField: UITextField!

func doneClicked(for textField: UITextField) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .short
    dateFormatter.timeStyle = .none

    //show on text field
    dateFormatter.dateFormat = "dd MMM yyyy"
    textField.text = dateFormatter.string(from: thePicker.date)

    //formated to store on mysql
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let finalDate: String = dateFormatter.string(from: thePicker.date)
    print(finalDate)
    textField.resignFirstResponder()
}

func cancelClicked(for textField: UITextField) {
    textField.resignFirstResponder()
}

func setUpTextFieldPicker(textField: UITextField, date: String) {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat =  "yyyy-MM-dd"

    if let fullDate = dateFormatter.date(from: date) {
        thePicker.date = fullDate
        dateFormatter.dateFormat = "dd MMM yyyy"
        let finalDate: String = dateFormatter.string(from: fullDate)
        textField.text = finalDate
    }


    textField.inputView = thePicker
    let toolbar = AccessoryToolbar(for: textField)
    toolbar.accessoryDelegate = self
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.thePicker = UIDatePicker(frame:CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216))
    self.thePicker.backgroundColor = UIColor.white
    self.thePicker.datePickerMode = UIDatePickerMode.date

    //data will be loaded from an API to a server. Hard Coded now just for testing
    setUpTextFieldPicker(textField: dateIssueTextField, date:"2000-12-25" )
    setUpTextFieldPicker(textField: dueDateTextField, date:"2010-05-03")
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
}
}

助手类

import UIKit

protocol AccessoryToolbarDelegate: class {
func doneClicked(for textField: UITextField)
func cancelClicked(for textField: UITextField)
}

class AccessoryToolbar: UIToolbar {

fileprivate let textField: UITextField

weak var accessoryDelegate: AccessoryToolbarDelegate?

init(for textField: UITextField) {
    self.textField = textField
    super.init(frame: CGRect.zero)

    self.barStyle = .default
    self.isTranslucent = true
    self.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
    self.sizeToFit()

    let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(doneClicked))
    let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelClicked))
    self.setItems([cancelButton, spaceButton, doneButton], animated: false)
    self.isUserInteractionEnabled = true

    textField.inputAccessoryView = self
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@objc fileprivate func doneClicked() {
    accessoryDelegate?.doneClicked(for: self.textField)
}

@objc fileprivate func cancelClicked() {
    accessoryDelegate?.cancelClicked(for: self.textField)
}
}

小记:我认为应该在 viewWillAppear 上读取和分配数据。

【问题讨论】:

    标签: ios swift uidatepicker


    【解决方案1】:

    您可以通过两种方式解决问题:

    1. 为每个文本字段创建两个 Date 对象,并更新新值 当你点击完成按钮时为那个对象。当文本字段成为第一响应者时,根据该日期更新日期选择器值。
    2. 当文本字段成为第一个时更新日期选择器值 响应者,您可以检查此代码:

      //1. Add UITextFieldDelegate
      class InvoiceViewController: UIViewController, AccessoryToolbarDelegate, UITextFieldDelegate {
           //......
      
      //2. Set delegate for the textfields
      override func viewDidLoad() {
          super.viewDidLoad()
      
          dateIssueTextField.delegate = self
          dueDateTextField.delegate = self
      
          //......
      }
      
      //3. Update the value of thePicker.date
      func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
          let dateFormatter = DateFormatter()
          dateFormatter.dateFormat =  "yyyy-MM-dd"
      
          if let fullDate = dateFormatter.date(from: textField.text) {
              thePicker.date = fullDate
          }
      
          return true
      }
      }
      

    【讨论】:

    • 解决方案 2 无效。解决方案1,我不确定我是否理解
    • 两者实际上是相同的,对于解决方案 1,您定义 2 个 Date() 对象来存储所选 thePicker.date 的值,而不是使用 String()。您应该检查以确保 textfield.delegate 不为零。并且还设置一个断点来检查方法 textFieldShouldBeginEditing 在您点击文本字段时是否正在调用。
    • 谢谢,我做了一些更改。伟大的“提示”是 textFieldShouldBeginEditing。我将加载数据从 viewDidLoad 移动到 viewWillAppear => dueDateTextField.text = "03 Mar 2001" 并删除了 setUpTextFieldPicker 的所有行,但最后 3 行。
    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多