首页 > 解决方案 > FSCalendar - 从选定的日期创建 segue 到另一个视图控制器

问题描述

我是编写 iOS 应用程序的初学者,目前正在使用 FSCalendar 开发日历应用程序。每当我在 FSCalendar 上点击所选日期时,我希望我的应用程序转到下一个视图控制器(以显示有关所选日期事件的详细信息),但我找不到创建从所选日期连接的 segue 的方法到视图控制器。

如果在这种情况下segue是要走的路,我该怎么做?但是,如果 segue 不是这样做的方法,请就其他可能的解决方案提出一些建议。先感谢您!

标签: iosswiftsegueviewcontrollerfscalendar

解决方案


FSCalendar 具有“选择日期”委托功能。如果您正在查看 Swift Storyboard Sample,则会调用它并将格式化的日期打印到调试控制台。这就是你可以触发你的segue的地方。

首先添加一个“详细信息”视图控制器类:

//
//  DetailViewController.swift
//  FSCalendarSwiftExample
//
//  Created by Don Mag on 8/31/20.
//

import UIKit

class DetailViewController: UIViewController {

    var selectedDate: Date?
    
    @IBOutlet var myLabel: UILabel!
    
    fileprivate let formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy/MM/dd"
        return formatter
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        if let d = selectedDate {
            myLabel.text = formatter.string(from: d)
        }
    }

}

使用几个标签将视图控制器添加到 Storyboard,将其类设置为DetailViewController,并将“详细标签”连接到myLabel @IBOutlet

在此处输入图像描述

Ctrl-Drag 从 FSCalendar 视图控制器顶部的视图控制器图标到新的 Detail View Controller,然后Show从弹出菜单中选择:

在此处输入图像描述

您会看到segue已添加 a。选择那个segue并给它一个标识符“gotoDetail”:

在此处输入图像描述

InterfaceBuilderViewController课堂上,找到这个函数:

func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {
    print("calendar did select date \(self.formatter.string(from: date))")
    if monthPosition == .previous || monthPosition == .next {
        calendar.setCurrentPage(date, animated: true)
    }
}

performSegue并在末尾添加一行:

func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {
    print("calendar did select date \(self.formatter.string(from: date))")
    if monthPosition == .previous || monthPosition == .next {
        calendar.setCurrentPage(date, animated: true)
    }
    // add this line
    self.performSegue(withIdentifier: "gotoDetail", sender: nil)
}

还在InterfaceBuilderViewController上课,找到prepare(for segue...函数:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let config = segue.destination as? CalendarConfigViewController {
        config.lunar = self.lunar
        config.theme = self.theme
        config.selectedDate = self.calendar.selectedDate
        config.firstWeekday = self.calendar.firstWeekday
        config.scrollDirection = self.calendar.scrollDirection
    }
}

并在最后添加此代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let config = segue.destination as? CalendarConfigViewController {
        config.lunar = self.lunar
        config.theme = self.theme
        config.selectedDate = self.calendar.selectedDate
        config.firstWeekday = self.calendar.firstWeekday
        config.scrollDirection = self.calendar.scrollDirection
    }
    // add this code
    if let detail = segue.destination as? DetailViewController {
        detail.selectedDate = calendar.selectedDate
    }
}

运行应用程序,Interface Builder从表格视图中选择,然后选择一个日期。您的新 Detail 控制器应该被推送到视图中,并且应该显示您选择的日期。


推荐阅读