日当-ヒナタ- swift4 -6- DatePickerを使ってみる
はじめに
Androidアプリ日当-ヒナタ-のiOS版を作り始めたのでその経過を少しアップします。普段の仕事ではSWIFTを触らないのでとても新鮮な感じと少し不安なとこもあり。。。少し機能を削り、早めのストア公開を目指します。 picker系のコントロールが少し手こずります。AndroidではAdapterと紐づける感じですが、iOSでは手順が違うので、試しながら進めている感じです、、標準的と思われる方法で実装しているつもりですが、個人的な所感ですが、どうもフォーム部品というよりは、キーボードの代わり??という感じですね。
機材
・Macbook air Xcode Version 10.1 Apple Swift version 4.2.1
・iphone5c テスト機
UIDatePickerを動かしてみました。
複数TableCellにダミーでTextFieldを配置して、TableCellラベルと連動させる方法です。ダミーTextFieldは1つで良いよ、とかプログラムから動的にとか、そもそもダミーTextFieldなんて要らないね、などいろいろ思いはありますが、今はこれで進めます。後々リファクタすると思いますがその時にしっかり実装すれば、、、今は動けば良いのです。。。
import UIKit extension UITableViewCell { @IBInspectable var checked: Bool { get { return detailTextLabel?.text?.count ?? 0 > 0 } set(value) { detailTextLabel?.text = value ? "✔️" : "" } } var textView: UITextField { get { for v in self.contentView.subviews { if let text = v as? UITextField { return text } } fatalError("implements none.") } } } class TripRegisterTableViewController: UITableViewController { @IBOutlet weak var mDateMin: UITableViewCell! @IBOutlet weak var mDateMax: UITableViewCell! @IBOutlet weak var mBackColor: UITextField! let datePickerView: UIDatePicker = UIDatePicker() static var dateFormat: DateFormatter = { let df: DateFormatter = DateFormatter() df.dateFormat = "yyyy年M月d日" return df }() func convert(_ text: String) -> Date { guard let result = TripRegisterTableViewController.dateFormat.date(from: text) else { return Date() } return result } override func viewDidLoad() { super.viewDidLoad() let toolbar = UIToolbar(frame: CGRect(x:0, y:0, width:0, height:35)) toolbar.setItems([ UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancel)) , UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) , UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.done))], animated: true) datePickerView.datePickerMode = UIDatePicker.Mode.date datePickerView.timeZone = NSTimeZone.local datePickerView.locale = Locale.current mDateMin.textView.inputView = datePickerView mDateMin.textView.inputAccessoryView = toolbar mDateMax.textView.inputView = datePickerView mDateMax.textView.inputAccessoryView = toolbar } @objc func done() { switch datePickerView.tag { case 0: mDateMin.textView.endEditing(true) mDateMin.textView.text = TripRegisterTableViewController.dateFormat.string(from: datePickerView.date) mDateMin.detailTextLabel?.text = mDateMin.textView.text if ComparisonResult.orderedAscending == convert(mDateMax.textView.text!).compare(datePickerView.date) { mDateMax.textView.text = mDateMin.textView.text mDateMax.detailTextLabel?.text = mDateMin.textView.text } break case 1: mDateMax.textView.endEditing(true) mDateMax.textView.text = TripRegisterTableViewController.dateFormat.string(from: datePickerView.date) mDateMax.detailTextLabel?.text = mDateMax.textView.text if ComparisonResult.orderedDescending == convert(mDateMin.textView.text!).compare(datePickerView.date) { mDateMin.textView.text = mDateMax.textView.text mDateMin.detailTextLabel?.text = mDateMax.textView.text } break default: break } } @objc func cancel() { mDateMin.textView.endEditing(true) mDateMax.textView.endEditing(true) } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) switch indexPath.section { case 0: switch indexPath.row { case 0: datePickerView.tag = 0 datePickerView.date = convert(mDateMin.detailTextLabel!.text!) mDateMin.textView.becomeFirstResponder() case 1: datePickerView.tag = 1 datePickerView.date = convert(mDateMax.detailTextLabel!.text!) mDateMax.textView.becomeFirstResponder() case 2: tableView.cellForRow(at: indexPath)?.checked = !(tableView.cellForRow(at: indexPath)?.checked ?? true) default: break } default: break } } } class TripRegisterViewController: ViewController { var mTableView: TripRegisterTableViewController? override func viewDidLoad() { super.viewDidLoad() self.navigationItem.setRightBarButton( UIBarButtonItem(title: "保存", style: .plain, target: self, action: #selector(self.onClickSave)), animated: true) let today = TripRegisterTableViewController.dateFormat.string(from: Date()) mTableView?.mDateMin.textView.text = today mTableView?.mDateMin.detailTextLabel?.text = today mTableView?.mDateMax.textView.text = today mTableView?.mDateMax.detailTextLabel?.text = today } @objc func onClickSave() { RealmHelper.shared.begin() RealmHelper.shared.commit() self.navigationController?.popViewController(animated: true) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { super.prepare(for: segue, sender: sender) if let vc = segue.destination as? TripRegisterTableViewController { self.mTableView = vc } } }
月末に近づき、なかなか時間が取れなくなってきました。。
なんとかリリースまで・・がんばりたい
ab39