FSCalendar - 从选定的日期创建 segue 到另一个视图控制器

Posted

技术标签:

【中文标题】FSCalendar - 从选定的日期创建 segue 到另一个视图控制器【英文标题】:FSCalendar - create segue from day selected to another view controller 【发布时间】:2020-08-31 17:29:17 【问题描述】:

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

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

【问题讨论】:

Storyboard 的视图控制器中有日历吗?还是您正在使用代码将其添加到视图中? 我的日历在故事板的视图控制器中。 @Clare 这个细节视图是在情节提要中设计的还是你设法在代码中构建了这个控制器? 我在情节提要中做到了。 【参考方案1】:

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 键从 FSCalendar 视图控制器顶部的视图控制器图标拖动到新的 Detail View Controller,然后从弹出菜单中选择 Show

您会看到已添加segue。选择那个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 控制器应该会被推送到视图中,并且应该会显示您选择的日期。

【讨论】:

感谢您的详细解释!我一直在跟进,但在创建 segue 后被卡住了。 interfaceBuilderViewController 类是 FSCalendar 库附带的吗?我找不到函数或类。 对不起,我不太清楚。以上所有内容均指 FSCalendar 存储库中的示例应用程序。 有道理!再次感谢您。

以上是关于FSCalendar - 从选定的日期创建 segue 到另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

使用选择日期快速更新 FSCalendar 标头值

如何以编程方式选择日期并在 FSCalendar 上显示

如何使用 FSCalendar 在有事件的圆圈中显示日期?

如何使用 FSCalendar 为日期显示 2 个不同颜色的点?

Swift FSCalendar 在表格视图的日历显示事件中选择日期

如何删除 FSCalendar Swift 库中的天数