13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-14

概要

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でカレンダーアプリを作ってみた。

13
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?