Commit ff3a3716 by Daniel Dahan

development: renamed Reminders to Event

parent 4b41d8fb
......@@ -40,8 +40,8 @@
96328B9E1E05C24E009A4C90 /* TableView.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96328B961E05C0BB009A4C90 /* TableView.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96328B9F1E05C24E009A4C90 /* TableViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = 96328B981E05C0CE009A4C90 /* TableViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; };
96334EF61C8B84660083986B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 96334EF51C8B84660083986B /* Assets.xcassets */; };
9639526C1EC3882F004BA9DE /* Reminders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9639526A1EC3882F004BA9DE /* Reminders.swift */; };
9639526D1EC3882F004BA9DE /* RemindersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9639526B1EC3882F004BA9DE /* RemindersController.swift */; };
9639526C1EC3882F004BA9DE /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9639526A1EC3882F004BA9DE /* Event.swift */; };
9639526D1EC3882F004BA9DE /* EventController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9639526B1EC3882F004BA9DE /* EventController.swift */; };
965E80CC1DD4C50600D61E4B /* Bar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96BCB7981CB40DC500C806FE /* Bar.swift */; };
965E80CD1DD4C50600D61E4B /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96BCB7701CB40DC500C806FE /* Button.swift */; };
965E80CE1DD4C50600D61E4B /* FABButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96BCB75F1CB40DC500C806FE /* FABButton.swift */; };
......@@ -206,8 +206,8 @@
96328B981E05C0CE009A4C90 /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = "<group>"; };
96334EF51C8B84660083986B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
963832361B88DFD80015F710 /* Material.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Material.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9639526A1EC3882F004BA9DE /* Reminders.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Reminders.swift; sourceTree = "<group>"; };
9639526B1EC3882F004BA9DE /* RemindersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemindersController.swift; sourceTree = "<group>"; };
9639526A1EC3882F004BA9DE /* Event.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Event.swift; sourceTree = "<group>"; };
9639526B1EC3882F004BA9DE /* EventController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventController.swift; sourceTree = "<group>"; };
963FBEFC1D669510008F8512 /* Snackbar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Snackbar.swift; sourceTree = "<group>"; };
965532281E47E388005C2792 /* SpringAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringAnimation.swift; sourceTree = "<group>"; };
9658F2161CD6FA4700B902C1 /* IconButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IconButton.swift; sourceTree = "<group>"; };
......@@ -394,12 +394,13 @@
name = Products;
sourceTree = "<group>";
};
963952691EC3882F004BA9DE /* Events */ = {
963952691EC3882F004BA9DE /* Event */ = {
isa = PBXGroup;
children = (
9639526A1EC3882F004BA9DE /* Reminders.swift */,
9639526B1EC3882F004BA9DE /* RemindersController.swift */,
9639526A1EC3882F004BA9DE /* Event.swift */,
9639526B1EC3882F004BA9DE /* EventController.swift */,
);
name = Event;
path = Events;
sourceTree = "<group>";
};
......@@ -508,7 +509,7 @@
96328B9A1E05C135009A4C90 /* Data */,
96BCB80B1CB410CC00C806FE /* Device */,
96230AB61D6A51FD00AF47DC /* Divider */,
963952691EC3882F004BA9DE /* Events */,
963952691EC3882F004BA9DE /* Event */,
96BCB80A1CB410A100C806FE /* Extension */,
963FBF021D6696D0008F8512 /* FABMenu */,
96BCB8071CB4101C00C806FE /* Font */,
......@@ -935,11 +936,11 @@
965E81191DD4D5C800D61E4B /* SnackbarController.swift in Sources */,
965E811A1DD4D5C800D61E4B /* StatusBarController.swift in Sources */,
965E811B1DD4D5C800D61E4B /* Switch.swift in Sources */,
9639526C1EC3882F004BA9DE /* Reminders.swift in Sources */,
9639526C1EC3882F004BA9DE /* Event.swift in Sources */,
965E811C1DD4D5C800D61E4B /* TabBar.swift in Sources */,
965E811D1DD4D5C800D61E4B /* TableViewCell.swift in Sources */,
965E811E1DD4D5C800D61E4B /* TextField.swift in Sources */,
9639526D1EC3882F004BA9DE /* RemindersController.swift in Sources */,
9639526D1EC3882F004BA9DE /* EventController.swift in Sources */,
965E811F1DD4D5C800D61E4B /* ErrorTextField.swift in Sources */,
965E81211DD4D5C800D61E4B /* TextStorage.swift in Sources */,
965E81221DD4D5C800D61E4B /* TextView.swift in Sources */,
......
......@@ -30,96 +30,96 @@
import EventKit
@objc(RemindersAuthorizationStatus)
public enum RemindersAuthorizationStatus: Int {
@objc(EventReminderAuthorizationStatus)
public enum EventReminderAuthorizationStatus: Int {
case authorized
case denied
}
@objc(RemindersPriority)
public enum RemindersPriority: Int {
@objc(EventReminderPriority)
public enum EventReminderPriority: Int {
case none
case high = 1
case medium = 5
case low = 9
}
@objc(RemindersDelegate)
public protocol RemindersDelegate {
@objc(EventDelegate)
public protocol EventDelegate {
/**
A delegation method that is executed when the Reminders status is updated.
- Parameter reminders: A reference to the Reminders.
- Parameter status: A reference to the ReminderAuthorizationStatus.
- Parameter event: A reference to the Reminders.
- Parameter status: A reference to the EventReminderAuthorizationStatus.
*/
@objc
optional func reminders(reminders: Reminders, status: RemindersAuthorizationStatus)
optional func event(event: Event, status: EventReminderAuthorizationStatus)
/**
A delegation method that is executed when reminders authorization is authorized.
- Parameter reminders: A reference to the Reminders.
A delegation method that is executed when event authorization is authorized.
- Parameter event: A reference to the Reminders.
*/
@objc
optional func reminders(authorized reminders: Reminders)
optional func event(authorized event: Event)
/**
A delegation method that is executed when reminders authorization is denied.
- Parameter reminders: A reference to the Reminders.
A delegation method that is executed when event authorization is denied.
- Parameter event: A reference to the Reminders.
*/
@objc
optional func reminders(denied reminders: Reminders)
optional func event(denied event: Event)
/**
A delegation method that is executed when a new calendar is created
- Parameter reminders: A reference to the Reminders.
- Parameter event: A reference to the Reminders.
- Parameter calendar: An optional reference to the calendar created.
- Parameter error: An optional error if the calendar failed to be created.
*/
@objc
optional func reminders(reminders: Reminders, createdCalendar calendar: EKCalendar?, error: Error?)
optional func event(event: Event, createdCalendar calendar: EKCalendar?, error: Error?)
/**
A delegation method that is executed when a new calendar is created.
- Parameter reminders: A reference to the Reminder.
- Parameter event: A reference to the Reminders.
- Parameter removed calendar: A reference to the calendar created.
- Parameter error: An optional error if the calendar failed to be removed.
*/
@objc
optional func reminders(reminders: Reminders, removedCalendar calendar: EKCalendar, error: Error?)
optional func event(event: Event, removedCalendar calendar: EKCalendar, error: Error?)
/**
A delegation method that is executed when a new reminder is created.
- Parameter reminders: A reference to the Reminders.
- Parameter event: A reference to the Reminders.
- Parameter calendar: An optional reference to the reminder created.
- Parameter error: An optional error if the reminder failed to be created.
*/
@objc
optional func reminders(reminders: Reminders, createdReminder reminder: EKReminder?, error: Error?)
optional func event(event: Event, createdReminders reminder: EKReminder?, error: Error?)
/**
A delegation method that is executed when a new Reminders list is created
- Parameter reminders: A reference to the Reminder.
- Parameter event: A reference to the Reminders.
- Parameter deleted: A boolean describing if the operation succeeded or not.
- Parameter error: An optional error if the reminder failed to be removed.
*/
@objc
optional func reminders(reminders: Reminders, removedReminder reminder: EKReminder, error: Error?)
optional func event(event: Event, removedReminders reminder: EKReminder, error: Error?)
}
@objc(Reminders)
open class Reminders: NSObject {
@objc(Event)
open class Event: NSObject {
/// A reference to the eventStore.
fileprivate let eventStore = EKEventStore()
fileprivate let store = EKEventStore()
/// The current ReminderAuthorizationStatus.
open var authorizationStatus: RemindersAuthorizationStatus {
/// The current EventReminderAuthorizationStatus.
open var authorizationStatus: EventReminderAuthorizationStatus {
return .authorized == EKEventStore.authorizationStatus(for: .reminder) ? .authorized : .denied
}
/// A reference to a RemindersDelegate.
open weak var delegate: RemindersDelegate?
open weak var delegate: EventDelegate?
open func requestAuthorization(_ completion: ((RemindersAuthorizationStatus) -> Void)? = nil) {
eventStore.requestAccess(to: .reminder) { [weak self, completion = completion] (isAuthorized, _) in
open func requestRemindersAuthorization(_ completion: ((EventReminderAuthorizationStatus) -> Void)? = nil) {
store.requestAccess(to: .reminder) { [weak self, completion = completion] (isAuthorized, _) in
DispatchQueue.main.async { [weak self, completion = completion] in
guard let s = self else {
return
......@@ -127,63 +127,63 @@ open class Reminders: NSObject {
guard isAuthorized else {
completion?(.denied)
s.delegate?.reminders?(reminders: s, status: .denied)
s.delegate?.reminders?(denied: s)
s.delegate?.event?(event: s, status: .denied)
s.delegate?.event?(denied: s)
return
}
completion?(.authorized)
s.delegate?.reminders?(reminders: s, status: .authorized)
s.delegate?.reminders?(authorized: s)
s.delegate?.event?(event: s, status: .authorized)
s.delegate?.event?(authorized: s)
}
}
}
}
extension Reminders {
extension Event {
/**
Creates a predicate for the reminders Array of calendars.
Creates a predicate for the event Array of calendars.
- Parameter in calendars: An optional Array of EKCalendars.
*/
open func predicateForReminders(in calendars: [EKCalendar]) -> NSPredicate {
return eventStore.predicateForReminders(in: calendars)
return store.predicateForReminders(in: calendars)
}
/**
Creates a predicate for the reminders Array of calendars that
Creates a predicate for the event Array of calendars that
are incomplete and have a given start and end date.
- Parameter starting: A Date.
- Parameter ending: A Date.
- Parameter calendars: An optional Array of [EKCalendar].
*/
open func predicateForIncompleteReminders(starting: Date, ending: Date, calendars: [EKCalendar]? = nil) -> NSPredicate {
return eventStore.predicateForIncompleteReminders(withDueDateStarting: starting, ending: ending, calendars: calendars)
return store.predicateForIncompleteReminders(withDueDateStarting: starting, ending: ending, calendars: calendars)
}
/**
Creates a predicate for the reminders Array of calendars that
Creates a predicate for the event Array of calendars that
are completed and have a given start and end date.
- Parameter starting: A Date.
- Parameter ending: A Date.
- Parameter calendars: An optional Array of [EKCalendar].
*/
open func predicateForCompletedReminders(starting: Date, ending: Date, calendars: [EKCalendar]? = nil) -> NSPredicate {
return eventStore.predicateForCompletedReminders(withCompletionDateStarting: starting, ending: ending, calendars: calendars)
return store.predicateForCompletedReminders(withCompletionDateStarting: starting, ending: ending, calendars: calendars)
}
}
extension Reminders {
extension Event {
/**
A method for retrieving reminder calendars in alphabetical order.
- Parameter completion: A completion call back
*/
open func calendars(completion: @escaping ([EKCalendar]) -> Void) {
open func calendarsForReminders(completion: @escaping ([EKCalendar]) -> Void) {
DispatchQueue.global(qos: .default).async { [weak self, completion = completion] in
guard let s = self else {
return
}
let calendar = s.eventStore.calendars(for: .reminder).sorted(by: { (a, b) -> Bool in
let calendar = s.store.calendars(for: .reminder).sorted(by: { (a, b) -> Bool in
return a.title < b.title
})
......@@ -197,22 +197,22 @@ extension Reminders {
A method for retrieving events with a predicate in date sorted order.
- Parameter predicate: A NSPredicate.
- Parameter completion: A completion call back.
- Returns: A fetch reminders request identifier.
- Returns: A fetch event request identifier.
*/
@discardableResult
open func reminders(matching predicate: NSPredicate, completion: @escaping ([EKReminder]) -> Void) -> Any {
return eventStore.fetchReminders(matching: predicate, completion: { [completion = completion] (reminders) in
return store.fetchReminders(matching: predicate, completion: { [completion = completion] (event) in
DispatchQueue.main.async { [completion = completion] in
completion(reminders ?? [])
completion(event ?? [])
}
})
}
/**
Fetch all the reminders in a given Array of calendars.
Fetch all the event in a given Array of calendars.
- Parameter in calendars: An Array of EKCalendars.
- Parameter completion: A completion call back.
- Returns: A fetch reminders request identifier.
- Returns: A fetch event request identifier.
*/
@discardableResult
open func reminders(in calendars: [EKCalendar], completion: @escaping ([EKReminder]) -> Void) -> Any {
......@@ -220,64 +220,64 @@ extension Reminders {
}
/**
Fetch all the reminders in a given Array of calendars that
Fetch all the event in a given Array of calendars that
are incomplete, given a start and end date.
- Parameter starting: A Date.
- Parameter ending: A Date.
- Parameter calendars: An Array of EKCalendars.
- Parameter completion: A completion call back.
- Returns: A fetch reminders request identifier.
- Returns: A fetch event request identifier.
*/
@discardableResult
open func incomplete(starting: Date, ending: Date, calendars: [EKCalendar]? = nil, completion: @escaping ([EKReminder]) -> Void) -> Any {
open func incompleteReminders(starting: Date, ending: Date, calendars: [EKCalendar]? = nil, completion: @escaping ([EKReminder]) -> Void) -> Any {
return reminders(matching: predicateForIncompleteReminders(starting: starting, ending: ending, calendars: calendars), completion: completion)
}
/**
Fetch all the reminders in a given Array of calendars that
Fetch all the event in a given Array of calendars that
are completed, given a start and end date.
- Parameter starting: A Date.
- Parameter ending: A Date.
- Parameter calendars: An Array of EKCalendars.
- Parameter completion: A completion call back.
- Returns: A fetch reminders request identifier.
- Returns: A fetch event request identifier.
*/
@discardableResult
open func completed(starting: Date, ending: Date, calendars: [EKCalendar]? = nil, completion: @escaping ([EKReminder]) -> Void) -> Any {
open func completedReminders(starting: Date, ending: Date, calendars: [EKCalendar]? = nil, completion: @escaping ([EKReminder]) -> Void) -> Any {
return reminders(matching: predicateForCompletedReminders(starting: starting, ending: ending, calendars: calendars), completion: completion)
}
/**
Cancels an active reminders request.
Cancels an active event request.
- Parameter _ identifier: An identifier.
*/
open func cancel(_ identifier: Any) {
eventStore.cancelFetchRequest(identifier)
store.cancelFetchRequest(identifier)
}
}
extension Reminders {
extension Event {
/**
A method for creating new Reminder calendar.
A method for creating new Reminders calendar.
- Parameter calendar title: the name of the list.
- Parameter completion: An optional completion call back.
*/
open func create(calendar title: String, completion: ((EKCalendar?, Error?) -> Void)? = nil) {
open func createCalendarForReminders(title: String, completion: ((EKCalendar?, Error?) -> Void)? = nil) {
DispatchQueue.global(qos: .default).async { [weak self, completion = completion] in
guard let s = self else {
return
}
let calendar = EKCalendar(for: .reminder, eventStore: s.eventStore)
let calendar = EKCalendar(for: .reminder, eventStore: s.store)
calendar.title = title
calendar.source = s.eventStore.defaultCalendarForNewReminders().source
calendar.source = s.store.defaultCalendarForNewReminders().source
var success = false
var error: Error?
do {
try s.eventStore.saveCalendar(calendar, commit: true)
try s.store.saveCalendar(calendar, commit: true)
success = true
} catch let e {
error = e
......@@ -289,7 +289,7 @@ extension Reminders {
}
completion?(success ? calendar : nil, error)
s.delegate?.reminders?(reminders: s, createdCalendar: success ? calendar : nil, error: error)
s.delegate?.event?(event: s, createdCalendar: success ? calendar : nil, error: error)
}
}
}
......@@ -299,7 +299,7 @@ extension Reminders {
- Parameter calendar identifier: The EKCalendar identifier String.
- Parameter completion: An optional completion call back.
*/
open func remove(calendar identifier: String, completion: ((Bool, Error?) -> Void)? = nil) {
open func removeCalendar(identifier: String, completion: ((Bool, Error?) -> Void)? = nil) {
DispatchQueue.global(qos: .default).async { [weak self, completion = completion] in
guard let s = self else {
return
......@@ -308,18 +308,18 @@ extension Reminders {
var success = false
var error: Error?
guard let calendar = s.eventStore.calendar(withIdentifier: identifier) else {
guard let calendar = s.store.calendar(withIdentifier: identifier) else {
var userInfo = [String: Any]()
userInfo[NSLocalizedDescriptionKey] = "[Material Error: Cannot fix remove calendar with identifier \(identifier).]"
userInfo[NSLocalizedFailureReasonErrorKey] = "[Material Error: Cannot fix remove calendar with identifier \(identifier).]"
error = NSError(domain: "com.cosmicmind.material.reminders", code: 0001, userInfo: userInfo)
error = NSError(domain: "com.cosmicmind.material.event", code: 0001, userInfo: userInfo)
completion?(success, error)
return
}
do {
try s.eventStore.removeCalendar(calendar, commit: true)
try s.store.removeCalendar(calendar, commit: true)
success = true
} catch let e {
error = e
......@@ -331,38 +331,38 @@ extension Reminders {
}
completion?(success, error)
s.delegate?.reminders?(reminders: s, removedCalendar: calendar, error: error)
s.delegate?.event?(event: s, removedCalendar: calendar, error: error)
}
}
}
}
extension Reminders {
extension Event {
// FIX ME: Should we use the calendar identifier here instead of the title for finding the right cal?
/**
A method for adding a new reminder to an optionally existing list.
if the list does not exist it will be added to the default reminders list.
if the list does not exist it will be added to the default event list.
- Parameter completion: optional A completion call back
*/
open func create(reminder title: String, calendar: EKCalendar, startDateComponents: DateComponents? = nil, dueDateComponents: DateComponents? = nil, priority: RemindersPriority? = .none, notes: String?, completion: ((EKReminder?, Error?) -> Void)? = nil) {
open func createReminder(title: String, calendar: EKCalendar, startDateComponents: DateComponents? = nil, dueDateComponents: DateComponents? = nil, priority: EventReminderPriority? = .none, notes: String?, completion: ((EKReminder?, Error?) -> Void)? = nil) {
DispatchQueue.global(qos: .default).async { [weak self, calendar = calendar, completion = completion] in
guard let s = self else {
return
}
let reminder = EKReminder(eventStore: s.eventStore)
let reminder = EKReminder(eventStore: s.store)
reminder.title = title
reminder.calendar = calendar
reminder.startDateComponents = startDateComponents
reminder.dueDateComponents = dueDateComponents
reminder.priority = priority?.rawValue ?? RemindersPriority.none.rawValue
reminder.priority = priority?.rawValue ?? EventReminderPriority.none.rawValue
reminder.notes = notes
var success = false
var error: Error?
do {
try s.eventStore.save(reminder, commit: true)
try s.store.save(reminder, commit: true)
success = true
} catch let e {
error = e
......@@ -374,17 +374,17 @@ extension Reminders {
}
completion?(success ? reminder : nil, error)
s.delegate?.reminders?(reminders: s, createdReminder: success ? reminder : nil, error: error)
s.delegate?.event?(event: s, createdReminders: success ? reminder : nil, error: error)
}
}
}
/**
A method for removing existing reminder,
- Parameter reminder identifier: The EKReminder identifier String.
- Parameter reminder identifier: The EKReminders identifier String.
- Parameter completion: An optional completion call back.
*/
open func remove(reminder identifier: String, completion: ((Bool, Error?) -> Void)? = nil) {
open func removeReminder(identifier: String, completion: ((Bool, Error?) -> Void)? = nil) {
DispatchQueue.global(qos: .default).async { [weak self, completion = completion] in
guard let s = self else {
return
......@@ -393,18 +393,18 @@ extension Reminders {
var success = false
var error: Error?
guard let reminder = s.eventStore.calendarItem(withIdentifier: identifier) as? EKReminder else {
guard let reminder = s.store.calendarItem(withIdentifier: identifier) as? EKReminder else {
var userInfo = [String: Any]()
userInfo[NSLocalizedDescriptionKey] = "[Material Error: Cannot fix remove calendar with identifier \(identifier).]"
userInfo[NSLocalizedFailureReasonErrorKey] = "[Material Error: Cannot fix remove calendar with identifier \(identifier).]"
error = NSError(domain: "com.cosmicmind.material.reminders", code: 0001, userInfo: userInfo)
error = NSError(domain: "com.cosmicmind.material.event", code: 0001, userInfo: userInfo)
completion?(success, error)
return
}
do {
try s.eventStore.remove(reminder, commit: true)
try s.store.remove(reminder, commit: true)
success = true
} catch let e {
error = e
......@@ -416,7 +416,7 @@ extension Reminders {
}
completion?(success, error)
s.delegate?.reminders?(reminders: s, removedReminder: reminder, error: error)
s.delegate?.event?(event: s, removedReminders: reminder, error: error)
}
}
}
......
......@@ -32,15 +32,15 @@ import UIKit
extension UIViewController {
/**
A convenience property that provides access to the RemindersController.
This is the recommended method of accessing the RemindersController
A convenience property that provides access to the EventController.
This is the recommended method of accessing the EventController
through child UIViewControllers.
*/
public var remindersController: RemindersController? {
public var eventController: EventController? {
var viewController: UIViewController? = self
while nil != viewController {
if viewController is RemindersController {
return viewController as? RemindersController
if viewController is EventController {
return viewController as? EventController
}
viewController = viewController?.parent
}
......@@ -48,9 +48,9 @@ extension UIViewController {
}
}
open class RemindersController: UIViewController {
/// A reference to a Reminder.
open let reminders = Reminders()
open class EventController: UIViewController {
/// A reference to an Event instance.
open let event = Event()
open override func viewDidLoad() {
super.viewDidLoad()
......@@ -68,15 +68,15 @@ open class RemindersController: UIViewController {
view.clipsToBounds = true
view.backgroundColor = .white
view.contentScaleFactor = Screen.scale
prepareReminders()
prepareEvent()
}
}
extension RemindersController {
/// Prepares the reminders.
fileprivate func prepareReminders() {
reminders.delegate = self
extension EventController {
/// Prepares the event instance.
fileprivate func prepareEvent() {
event.delegate = self
}
}
extension RemindersController: RemindersDelegate {}
extension EventController: EventDelegate {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment