概要
FSCalendarではカレンダーの日付の下に任意の条件で点マークを表示することができます。
今回はRealmDataBaseと組み合わせてデータが入っているcellの数に応じて点マークを表示してみます。
FSCalendarの導入方法は本家のライブラリのソースが上がっているGitHubのreadmeに書かれていますので、そちらをご参照ください。
実行環境
【Xcode】 Version 10.1
【Swift】 version 4.2.1
【CocoaPods】version 1.6.0
【Realm Database】 3.13.1
【FSCalendar】version 2.8.0
実装方法
以下のメソッドを用いることで点マークがつけられるようになります。しかしこのまま用いても全ての日付の下に点マークが付くようになるだけです。
これをRealmDataBaseと組み合わせることで、任意の日付に任意の数の点マークがつけられるようになります。
func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int{
return 1 //ここに入る数字によって点の数が変わる
}
実装前の状態
import UIKit
import FSCalendar
import RealmSwift
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, FSCalendarDelegate, FSCalendarDataSource {
@IBOutlet weak var calendar: FSCalendar!
@IBOutlet weak var tableView: UITableView!
var list: Results<Data>!
override func viewDidLoad() {
super.viewDidLoad()
calendar.dataSource = self
calendar.delegate = self
tableView.dataSource = self
tableView.delegate = self
// サンプルデータを追加
for i in 1...3 {
let newList = Data()
newList.title = "テスト" + String(i)
newList.date = Date()
do {
let realm = try Realm()
try realm.write({ () -> Void in
realm.add(newList)
})
} catch {
}
}
// Realmからデータを取得
do {
let realm = try Realm()
list = realm.objects(Data.self)
} catch {
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return list.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// セルを取得する
let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "calendarsCell", for: indexPath)
cell.textLabel!.text = list[indexPath.row].title
return cell
}
}
実装後の状態
RealmDBから日付が最初(0時)と最後(24時)の間で設定されているデータを取得し、そのデータの数を返すようにすることで任意の日付に任意の数の点マークがつけられるようになります。
// リストの数だけ日付に点マークをつける
func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int{
var tmpList: Results<Data>!
// 対象の日付が設定されているデータを取得する
do {
let realm = try Realm()
let predicate = NSPredicate(format: "%@ =< date AND date < %@", getBeginingAndEndOfDay(date).begining as CVarArg, getBeginingAndEndOfDay(date).end as CVarArg)
tmpList = realm.objects(Data.self).filter(predicate)
} catch {
}
return tmpList.count
}
// 日の始まりと終わりを取得
private func getBeginingAndEndOfDay(_ date:Date) -> (begining: Date , end: Date) {
let begining = Calendar(identifier: .gregorian).startOfDay(for: date)
let end = begining + 24*60*60
return (begining, end)
}
どなたかのお役に立てたら幸いです。
参考
Swiftで簡単にカレンダーを作ろう!(FSCalendar)
Swift4 + Realmでカレンダーアプリを作ってみた。