swift3 UserDefaultsに保存した日時を他のViewのカレンダーのセルに表示
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,425
ただいまswift3で誕生日通知カレンダーアプリの作成をしています。
名前、誕生日、通知日の三つを一応UserDefaultsのDictionary型で保存することはできたと思うのですが、
他のviewにあるカレンダーのセルで、保存した誕生日と合致する日のセルの色だけを変更したいと思っています。
どこをどういじればいいかもわからないくらい行き詰ってしまいました。大雑把過ぎますがよろしくお願いいたします。
ソースコードを明記しておきます。
addBirth.swift(名前、誕生日、通知日を保存するView)
import Foundation
import UIKit
class addBirth: UIViewController, UICollectionViewDelegate{
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var textField2: UITextField!
@IBOutlet weak var name: UITextField!
var toolBar:UIToolbar!
var toolBar2:UIToolbar!
var toolBar3:UIToolbar!
var myDatePicker: UIDatePicker!
var myDatePicker2: UIDatePicker!
let userDefaults = UserDefaults.standard
override func viewDidLoad() {
super.viewDidLoad()
//誕生日
// 入力欄の設定
textField.placeholder = dateToString(date: Date()) //<-`dateToString`のパラメータは`Date`型なので最初から`Date()`を渡す
textField.text = dateToString(date: Date()) //<-同上
self.view.addSubview(textField)
//通知日
// 入力欄の設定
textField2.placeholder = dateToString(date: Date()) //<-`dateToString`のパラメータは`Date`型なので最初から`Date()`を渡す
textField2.text = dateToString(date: Date()) //<-同上
self.view.addSubview(textField2)
// UIDatePickerの設定
myDatePicker = UIDatePicker()
myDatePicker.addTarget(self, action: #selector(changedDateEvent), for: UIControlEvents.valueChanged)
myDatePicker.datePickerMode = UIDatePickerMode.date
textField.inputView = myDatePicker
// UIToolBarの設定
toolBar = UIToolbar(frame: CGRect(x: 0, y: self.view.frame.size.height/6, width: self.view.frame.size.width, height: 40.0))
toolBar.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0)
toolBar.barStyle = .blackTranslucent
toolBar.tintColor = UIColor.white
toolBar.backgroundColor = UIColor.black
let toolBarBtn = UIBarButtonItem(title: "完了", style: .plain, target: self, action: #selector(tappedToolBarBtn))
let toolBarBtnToday = UIBarButtonItem(title: "今日", style: .plain, target: self, action: #selector(tappedToolBarBtnToday))
toolBarBtn.tag = 1
toolBar.items = [toolBarBtn, toolBarBtnToday]
textField.inputAccessoryView = toolBar
//通知日
// 入力欄の設定
textField2.placeholder = dateToString(date: Date()) //<-`dateToString`のパラメータは`Date`型なので最初から`Date()`を渡す
textField2.text = dateToString(date: Date()) //<-同上
self.view.addSubview(textField2)
// UIDatePickerの設定
myDatePicker2 = UIDatePicker()
myDatePicker2.addTarget(self, action: #selector(changedDateEvent), for: UIControlEvents.valueChanged)
myDatePicker2.datePickerMode = UIDatePickerMode.date
textField2.inputView = myDatePicker2
// UIToolBarの設定
toolBar2 = UIToolbar(frame: CGRect(x: 0, y: self.view.frame.size.height/6, width: self.view.frame.size.width, height: 40.0))
toolBar2.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0)
toolBar2.barStyle = .blackTranslucent
toolBar2.tintColor = UIColor.white
toolBar2.backgroundColor = UIColor.black
let toolBarBtn2 = UIBarButtonItem(title: "完了", style: .plain, target: self, action: #selector(tappedToolBarBtn))
let toolBarBtnToday2 = UIBarButtonItem(title: "今日", style: .plain, target: self, action: #selector(tappedToolBarBtnToday))
toolBarBtn2.tag = 1
toolBar2.items = [toolBarBtn2, toolBarBtnToday2]
textField2.inputAccessoryView = toolBar2
//氏名
// UIToolBarの設定
toolBar3 = UIToolbar(frame: CGRect(x: 0, y: self.view.frame.size.height/6, width: self.view.frame.size.width, height: 40.0))
toolBar3.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0)
toolBar3.barStyle = .blackTranslucent
toolBar3.tintColor = UIColor.white
toolBar3.backgroundColor = UIColor.black
let toolBarBtn3 = UIBarButtonItem(title: "完了", style: .plain, target: self, action: #selector(tappedToolBarBtn))
toolBarBtn3.tag = 1
toolBar3.items = [toolBarBtn2]
name.inputAccessoryView = toolBar3
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//誕生日
// 「完了」を押すと閉じる
@objc func tappedToolBarBtn(_ sender: UIBarButtonItem) {
textField.resignFirstResponder()
textField2.resignFirstResponder()
name.resignFirstResponder()
}
// 「今日」を押すと今日の日付をセットする
@objc func tappedToolBarBtnToday(_ sender: UIBarButtonItem) {
myDatePicker.date = Date() //<-Date型のプロパティに現在時刻を入れるなら`Date()`を渡すだけでOK
changeLabelDate(date: Date()) //<-Date型の引数に現在時刻を渡すときも同じく`Date()`だけでOK
myDatePicker2.date = Date()
changeLabelDate2(date: Date())
}
@objc func changedDateEvent(_ sender: UIDatePicker){ //<- `UIDatePicker`からのactionの`sender`は必ず`UIDatePicker`になる
//`sender`を直接`UIDatePicker`として使えばいいのでキャストは不要
self.changeLabelDate(date: sender.date)
}
func changeLabelDate(date: Date) { //<- `NSDate`を使っているところは全て`Date`に置き換える
textField.text = self.dateToString(date: date)
}
func dateToString(date: Date) -> String {
//DateFormatterは参照型なので、letが適切
let date_formatter = DateFormatter()
//曜日の1文字表記をしたいならweekdaysなんて配列はいらない
date_formatter.locale = Locale(identifier: "ja")
date_formatter.dateFormat = "yyyy年MM月dd日(E) " //<-`E`は曜日出力用のフォーマット文字
return date_formatter.string(from: date as Date)
}
//通知日
@objc func changedDateEvent2(_ sender: UIDatePicker){ //<- `UIDatePicker`からのactionの`sender`は必ず`UIDatePicker`になる
//`sender`を直接`UIDatePicker`として使えばいいのでキャストは不要
self.changeLabelDate2(date: sender.date)
}
func changeLabelDate2(date: Date) { //<- `NSDate`を使っているところは全て`Date`に置き換える
textField.text = self.dateToString(date: date)
}
func dateToString2(date: Date) -> String {
//DateFormatterは参照型なので、letが適切
let date_formatter2 = DateFormatter()
//曜日の1文字表記をしたいならweekdaysなんて配列はいらない
date_formatter2.locale = Locale(identifier: "ja")
date_formatter2.dateFormat = "yyyy年MM月dd日(E) " //<-`E`は曜日出力用のフォーマット文字
return date_formatter2.string(from: date as Date)
}
@IBAction func save(_ sender: Any) {
//Dictionary型のデータを保存、読込
userDefaults.set(["NAME":"name","BIRTH":"textField","ALART":"textField2"], forKey: "SAVE")
}
}
あとは、
ViewController.swift(カレンダー表示View)
DataManager.swift(カレンダーのセル編集View)
を使っています。(文字数の関係で載せることができませんでした。)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる