关于swift的日历计划注册逻辑(swift,firebase)

时间:2018-10-28 09:42:32

标签: ios swift

这是一个问题。

第73行(TableView的CellForRowAt)将发生错误“索引超出范围”。但是,我认为价值观包含在``事件''中,但是为什么会这样?

此外,这是一个问题。我不能完全质疑逻辑。

我打算立即实施日历,并将FSCalendar用作库。简单的日历已完成,事件已注册为下一步(例如,事件⇨“县会议”,“开始日期”⇨“ 10月1日”,“结束日期”⇨“ 10月10日”)我想显示它在日历底部的UITableView中。

但是,我在编码之前不了解逻辑,并且遇到麻烦,因为即使我进行检查也不会出来。

数据库使用CloudFireStore,并且作为结构,

date_end:“ 2018年9月23日”,

date_start:“ 2018年9月27日”,

event_title:“高宝池比赛”,

scheduleID:“ 6F4YLHAcwZ3GuSS81sGK”,

time_end:“ 10:00”,

time_start:“ 16:00”,

已经成为。

我想告诉我是否存在可以突破的逻辑,或者数据库结构本身是错误的。另外,如果您不知道含义,我想告诉您。

import UIKit
import Firebase
import FSCalendar
import CalculateCalendarLogic

struct DisplayEvent {
  var event: String
}

class scheduleViewController: UIViewController {

  @IBOutlet weak var calendar: FSCalendar!
  @IBOutlet weak var pickedDate: UILabel!
  @IBOutlet weak var tableView: UITableView!

  let db = Firestore.firestore()

  var events = [DisplayEvent]()

  var fireAuthUID = (Auth.auth().currentUser?.uid ?? "no data")

  var teamIDFromFirebase: String = String()

  var timeIntervalArray: [String] = []

  override func viewDidLoad() {
    super.viewDidLoad()

    calendar.dataSource = self
    calendar.delegate = self
    tableView.delegate = self
    tableView.dataSource = self

    tableView.register(UINib(nibName: "ScheduleTableViewCell", bundle: nil), forCellReuseIdentifier: "scheduleCell")

    currentDate(pickedDate)

    beginAlert()
  }

  fileprivate let gregorian: Calendar = Calendar(identifier: .gregorian)
    fileprivate lazy var dateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "ja_JP")
    formatter.dateFormat = "yyyy年MM月dd日"
    return formatter
  }()


  @IBAction func nextTapped(_ sender:UIButton) {
    calendar.setCurrentPage(getNextMonth(date: calendar.currentPage), animated: true)
  }

  @IBAction  func previousTapped(_ sender:UIButton) {
    calendar.setCurrentPage(getPreviousMonth(date: calendar.currentPage), animated: true)
  }

  @IBAction func TapApp(_ sender: Any) {
    let eventShare = self.storyboard?.instantiateViewController(withIdentifier: "planController") as! planController
    self.present(eventShare, animated: true, completion: nil)
  }
}





extension scheduleViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "scheduleCell", for: indexPath) as! ScheduleTableViewCell
      let hogeCell = DisplayEvent(event: events[indexPath.row] as! String).event

      cell.commonInit(schedule: hogeCell)
      return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
      return 70
    }
}


extension scheduleViewController: FSCalendarDelegate,FSCalendarDataSource,FSCalendarDelegateAppearance {

  func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition){
    let selectDay = getDay(date)
    pickedDate.text = "\(String(selectDay.1))月\(String(selectDay.2))日\(String(selectDay.3))曜日"
    let scheduleForDate = "\(String(selectDay.0))年\(String(selectDay.1))月\(String(selectDay.2))日"
    getScheduleDate(date: scheduleForDate)
    self.tableView.reloadData()
  }


  func judgeHoliday(_ date : Date) -> Bool {
    let tmpCalendar = Calendar(identifier: .gregorian)

    let year = tmpCalendar.component(.year, from: date)
    let month = tmpCalendar.component(.month, from: date)
    let day = tmpCalendar.component(.day, from: date)

    let holiday = CalculateCalendarLogic()
    return holiday.judgeJapaneseHoliday(year: year, month: month, day: day)
  }

  func getDay(_ date:Date) -> (Int,Int,Int,String){
    let tmpCalendar = Calendar(identifier: .gregorian)
    let Component = tmpCalendar.component(.weekday, from: date)
    let weekName = Component - 1
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "ja")

    let year = tmpCalendar.component(.year, from: date)
    let month = tmpCalendar.component(.month, from: date)
    let day = tmpCalendar.component(.day, from: date)

    return (year,month,day,formatter.shortWeekdaySymbols[weekName])
  }

  func getWeekIdx(_ date: Date) -> Int{
    let tmpCalendar = Calendar(identifier: .gregorian)
    return tmpCalendar.component(.weekday, from: date)
  }

  func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleDefaultColorFor date: Date) -> UIColor? {

    if self.judgeHoliday(date){
        return UIColor.red
    }

    let weekday = self.getWeekIdx(date)
    if weekday == 1 {
        return UIColor.red

    }
    else if weekday == 7 {
        return UIColor.blue
    }

    return nil
  }

  func getNextMonth(date:Date)->Date {
    return  Calendar.current.date(byAdding: .month, value: 1, to:date)!
  }

  func getPreviousMonth(date:Date)->Date {
    return  Calendar.current.date(byAdding: .month, value: -1, to:date)!
  }

  func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int {
    let dateString = dateFormatter.string(from: date)
    return 0
  }

}


private extension scheduleViewController {

  func currentDate(_ currentTet: UILabel) {
    let currentPickedDate = getDay(Date())
    currentTet.text = "\(String(currentPickedDate.1))月\(String(currentPickedDate.2))日\(String(currentPickedDate.3))曜日"
  }

  func beginAlert() {
    let alert: UIAlertController = UIAlertController(title: "ようこそ!", message: "マイページでチームIDを確認しよう!", preferredStyle:  UIAlertControllerStyle.alert)
    let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:{
    (action: UIAlertAction!) -> Void in
      print("OK")
    })
    alert.addAction(defaultAction)
    present(alert, animated: true, completion: nil)
  }

  func generateTimeRange(date: String) -> [String]? {
    var result: [String] = []
    guard var startTime = dateFormatter.date(from: date) else { return nil }
    guard let endTime = dateFormatter.date(from: date) else { return nil }

    while startTime <= endTime {
        result.append(dateFormatter.string(from: startTime))
        startTime = Calendar.current.date(byAdding: .day, value: 1, to: startTime)!
    }
    return result
  }

  func getScheduleDate(date: Any) {

    var startTimeArrForStart = [Any]()
    var endTimeArrForStart = [Any]()
    var scheduleArrForStart = [Any]()

self.db.collection("users").document(fireAuthUID).addSnapshotListener { (snapshot, error) in
        guard let document = snapshot else {
            print("erorr2 \(String(describing: error))")
            return
        }
        guard let data = document.data() else { return }
        self.teamIDFromFirebase = data["teamID"] as? String ?? ""
        self.db
            .collection("teams")
            .document(self.teamIDFromFirebase)
            .collection("schedule")
            .whereField("date_start", isEqualTo: date)
            .getDocuments() { (querySnapshot, err) in
            if err != nil {
                print("scheduleを取得できませんでした")
                return
            } else {
                for document in querySnapshot!.documents {
                    guard let dataFromFirebase: [String : Any] = document.data() else { return }
                    let startTimeFromFirebase = dataFromFirebase["date_start"] ?? ""
                    let endTimeFromFirebase = dataFromFirebase["date_end"] ?? ""
                    let scheduleFromFirebase = dataFromFirebase["event_title"] ?? ""
                    startTimeArrForStart.append(startTimeFromFirebase)
                    endTimeArrForStart.append(endTimeFromFirebase)
                    self.events.append(DisplayEvent(event: scheduleFromFirebase as! String))
                    self.tableView.reloadData()
                  }
              }
          }
      }
  }

}

0 个答案:

没有答案