无法向我的闹钟应用程序发送通知
having trouble implementing notifications to my alarm app
我创建了一个与 ios 闹钟应用相似的闹钟应用,单元格和表格视图也与其相似。这些单元格有 2 个标签和开关按钮,这样当我打开按钮时,警报会在单元格的标签时间激活。
有一个 triggerAlarm()
函数可以跟踪时间并循环遍历 items
类型的数组 [Item]()
(Item
是一个 class 类型 NSManagedObject
保存数据。它有 2 个属性 time: String
& isOn: Bool
).
问题是 viewDidLoad()
中的 Timer
方法不是 运行 通过 triggerAlarm()
func 中的那个循环而是打印 realTime
。该循环应该将 realTime
与 items 数组进行比较,如果 isOn
属性 为真但它没有发生,则调用 notificationTrigger()
函数。
Xcode 也没有显示任何错误。
这是代码:
import UIKit
import UserNotifications
class TableViewController: UITableViewController {
var realTime = String()
var items = [Item]()
override func viewDidLoad() {
super.viewDidLoad()
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {didAllow, error in})
}
override func viewWillAppear(_ animated: Bool) {
getData()
tableView.reloadData()
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell
let row = items[indexPath.row]
cell.timeLbl.text = row.time
cell.switchBtn.isOn = row.isOn
cell.callback = { newValue in
row.isOn = newValue
(UIApplication.shared.delegate as! AppDelegate).saveContext()
}
return cell
}
func getData() {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
items = try context.fetch(Item.fetchRequest())
}catch{
print("\(error)")
}
}
func triggerAlarm() {
realTime = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .short)
print(realTime)
for i in 0..<items.count {
if (items[i].time!) == realTime && items[i].isOn == true{
print(time)
self.notificationTrigger()
}else {
return
}
}
}
func notificationTrigger() {
let content = UNMutableNotificationContent()
content.title = "time is up \(time)"
content.subtitle = "asdf"
content.body = "qwer"
content.badge = 0
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
let request = UNNotificationRequest(identifier: "customNotification", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
}
@objc func triggerAlarm() {
realTime = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .short)
print(realTime)
for i in 0..<items.count {
if (items[i].time!) == realTime && items[i].isOn == true{
print(time)
self.notificationTrigger()
}else {
return
}
}
}
这里你在 else 中使用了 return。 因此,不是打破当前迭代的循环(我想你想实现这一点),而是从整个方法调用中 returning。而是使用:-
continue
或者最好省略 else 部分
@objc func triggerAlarm() {
realTime = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .short)
print(realTime)
for i in 0..<items.count {
if (items[i].time!) == realTime && items[i].isOn == true{
print(time)
self.notificationTrigger()
}
}
}
我创建了一个与 ios 闹钟应用相似的闹钟应用,单元格和表格视图也与其相似。这些单元格有 2 个标签和开关按钮,这样当我打开按钮时,警报会在单元格的标签时间激活。
有一个 triggerAlarm()
函数可以跟踪时间并循环遍历 items
类型的数组 [Item]()
(Item
是一个 class 类型 NSManagedObject
保存数据。它有 2 个属性 time: String
& isOn: Bool
).
问题是 viewDidLoad()
中的 Timer
方法不是 运行 通过 triggerAlarm()
func 中的那个循环而是打印 realTime
。该循环应该将 realTime
与 items 数组进行比较,如果 isOn
属性 为真但它没有发生,则调用 notificationTrigger()
函数。
Xcode 也没有显示任何错误。
这是代码:
import UIKit
import UserNotifications
class TableViewController: UITableViewController {
var realTime = String()
var items = [Item]()
override func viewDidLoad() {
super.viewDidLoad()
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {didAllow, error in})
}
override func viewWillAppear(_ animated: Bool) {
getData()
tableView.reloadData()
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell
let row = items[indexPath.row]
cell.timeLbl.text = row.time
cell.switchBtn.isOn = row.isOn
cell.callback = { newValue in
row.isOn = newValue
(UIApplication.shared.delegate as! AppDelegate).saveContext()
}
return cell
}
func getData() {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
items = try context.fetch(Item.fetchRequest())
}catch{
print("\(error)")
}
}
func triggerAlarm() {
realTime = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .short)
print(realTime)
for i in 0..<items.count {
if (items[i].time!) == realTime && items[i].isOn == true{
print(time)
self.notificationTrigger()
}else {
return
}
}
}
func notificationTrigger() {
let content = UNMutableNotificationContent()
content.title = "time is up \(time)"
content.subtitle = "asdf"
content.body = "qwer"
content.badge = 0
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
let request = UNNotificationRequest(identifier: "customNotification", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
}
@objc func triggerAlarm() {
realTime = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .short)
print(realTime)
for i in 0..<items.count {
if (items[i].time!) == realTime && items[i].isOn == true{
print(time)
self.notificationTrigger()
}else {
return
}
}
}
这里你在 else 中使用了 return。 因此,不是打破当前迭代的循环(我想你想实现这一点),而是从整个方法调用中 returning。而是使用:-
continue
或者最好省略 else 部分
@objc func triggerAlarm() {
realTime = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .short)
print(realTime)
for i in 0..<items.count {
if (items[i].time!) == realTime && items[i].isOn == true{
print(time)
self.notificationTrigger()
}
}
}