CocoaPods
Swift
Realm
FSCalendar
Swift4.2

【Swift4】FSCalendarのカレンダーに表示する点マークとテーブルのセルの数を対応させる


概要

FSCalendarではカレンダーの日付の下に任意の条件で点マークを表示することができます。

今回はRealmDataBaseと組み合わせてデータが入っているcellの数に応じて点マークを表示してみます。

FSCalendarの導入方法は本家のライブラリのソースが上がっているGitHubのreadmeに書かれていますので、そちらをご参照ください。

WenchaoD/FSCalendar


実行環境

【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 //ここに入る数字によって点の数が変わる
}


実装前の状態

点マークをつける前の状態です。

スクリーンショット 2019-04-14 20.54.22.png

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)
}

スクリーンショット 2019-04-14 21.11.31.png

どなたかのお役に立てたら幸いです。


参考

Swiftで簡単にカレンダーを作ろう!(FSCalendar)

Swift4 + Realmでカレンダーアプリを作ってみた。