Быстрое повторное локальное оповещение настроено - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь настроить ежедневные повторные уведомления с помощью swift.

Я могу настроить уведомление с помощью

var dateComponents = DateComponents()
dateComponents.hour = 17
dateComponents.minute = 00

Но я хочу, чтобы пользователь мог это изменить, я настроил средство выбора даты и изменил его только на время

В окне выбора даты я смог его сохранить, выполнив следующее

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    loadDate(animation: true)
}

func saveDate() {
    UserDefaults.standard.set(TimePicker.date, forKey:dateKey)
}

func loadDate(animation: Bool) {
    guard let loadedDate = UserDefaults.standard.object(forKey: dateKey) as? NSDate else { return }

    TimePicker.setDate(loadedDate as Date, animated: animation)
}

Как передать выбранные часы и минуты времени уведомления? Кроме того, как бы я мог преобразовать время в 24 часа таким образом, если они выберут 5 вечера, он перейдет к компоненту даты как 17?

Спасибо за любую помощь

Вот так у меня есть контроллер вида. Внутри viewdidload. и тогда указатель времени находится внутри другого контроллера вида

let center = UNUserNotificationCenter.current()

center.requestAuthorization(options: [.alert, .sound ]){(grandted,error)in }


let content = UNMutableNotificationContent()
content.title = "Title"
content.body = "Body"

var dateComponents = DateComponents()
dateComponents.hour = 17
dateComponents.minute = 18

let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)


let uuidstring = UUID().uuidString

let request = UNNotificationRequest(identifier: uuidstring, content: content, trigger: trigger)

center.add(request) {(error) in}

1 Ответ

0 голосов
/ 24 марта 2019

Поскольку вы выбираете время на другом контроллере вида (секунде), вам необходимо уведомить первый (основной) контроллер вида, что дата была изменена.

Здесь много разных способов сделать это. Передача данных между контроллерами представления
Выберите любой, который вам нравится, для этого примера я буду использовать уведомления:

extension Notification.Name {
    /// Notification used to pass user selected date
    static let dateChanged = Notification.Name(rawValue: "DateChanged")
}

Во второй функции сохранения обновления контроллера:

func saveDate() {
    UserDefaults.standard.set(TimePicker.date, forKey:dateKey)
    /// Send notification with new time
    NotificationCenter.default.post(name: .dateChanged, object: TimePicker.date)
}

В это же время в главном контроллере нужно подписаться на уведомления:

deinit {
    /// We need to unsubscribe from notifications, otherwise app can crash
    NotificationCenter.default.removeObserver(self)
}

override func viewDidLoad() {
    super.viewDidLoad()
    ...
    /// Subscribe to notifications 
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(dateChanged(_:)),
        name: .dateChanged,
        object: nil
    )
}

/// This method will be called when controller receive notification
/// It need to be annotated with @objc
@objc func dateChanged(_ notification: Notification) {
    let date = notification.object as! Date
    let components = Calendar.current.dateComponents([.hour, .minute], from: date)
    setNotification(with: components)
}

/// By always using same ID for local notifications 
/// You can easily remove them when time changes
private static let notificationID = "MyAppNotificationID"

func setNotification(with components: DateComponents) {
    /// Remove previously planned notification
    center.removePendingNotificationRequests(withIdentifiers: [MainVC.notificationID])

    /// Create new notificaion
    let content = UNMutableNotificationContent()
    content.title = "Title"
    content.body = "Body"
    let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true)
    let request = UNNotificationRequest(identifier: MainVC.notificationID, content: content, trigger: trigger)

    /// Add to center
    center.add(request) {(error) in}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...