如何使用 for 循环获取 UNNotificationRequest 数组来填充 SwiftUI 列表视图?
How can I get UNNotificationRequest array using for loop to populate SwiftUI List view?
我只想获取计划的本地通知列表并使用 forEach
填充 SwiftUI 列表。我相信它应该像我在下面所做的那样工作,但是数组总是空的,因为它似乎在 for 循环完成之前就被使用了。我尝试了带有完成处理程序的 getNotifications()
函数,也尝试了 return 函数,但这两种方式仍然无效。我怎样才能等到 for 循环完成才能填充我的列表?或者如果有其他方法可以做到这一点,请告诉我,谢谢。
var notificationArray = [UNNotificationRequest]()
func getNotifications() {
print("getNotifications")
center.getPendingNotificationRequests(completionHandler: { requests in
for request in requests {
print(request.content.title)
notificationArray.append(request)
}
})
}
struct ListView: View {
var body: some View {
NavigationView {
List {
ForEach(notificationArray, id: \.content) { notification in
HStack {
VStack(alignment: .leading, spacing: 10) {
let notif = notification.content
Text(notif.title)
Text(notif.subtitle)
.opacity(0.5)
}
}
}
}
.onAppear() {
getNotifications()
}
}
}
更新:
以下是我添加新通知并再次调用 getNotifications
的方式。我希望列表在创建新数组时动态更新。打印到控制台显示 getNotifications
工作正常并且新数组包含添加的通知。
Section {
Button(action: {
print("Adding Notification: ", title, bodyText, timeIntValue[previewIndex])
addNotification(title: title, bodyText: bodyText, timeInt: timeIntValue[previewIndex])
showDetail = false
self.vm.getNotifications()
}) {
Text("Save Notification")
}
}.disabled(title.isEmpty || bodyText.isEmpty)
您的全局 notificationArray
未被视图观察到。它应该是动态的 属性...可能的解决方案是将其包装到 ObservableObject
视图模型中。
这里有一个解决方案演示:
class ViewModel: ObservableObject {
@Published var notificationArray = [UNNotificationRequest]()
func getNotifications() {
print("getNotifications")
center.getPendingNotificationRequests(completionHandler: { requests in
var newArray = [UNNotificationRequest]()
for request in requests {
print(request.content.title)
newArray.append(request)
}
DispatchQueue.main.async {
self.notificationArray = newArray
}
})
}
}
struct ListView: View {
@ObservedObject var vm = ViewModel()
//@StateObject var vm = ViewModel() // << for SwiftUI 2.0
var body: some View {
NavigationView {
List {
ForEach(vm.notificationArray, id: \.content) { notification in
HStack {
VStack(alignment: .leading, spacing: 10) {
let notif = notification.content
Text(notif.title)
Text(notif.subtitle)
.opacity(0.5)
}
}
}
}
.onAppear() {
self.vm.getNotifications()
}
}
}
我只想获取计划的本地通知列表并使用 forEach
填充 SwiftUI 列表。我相信它应该像我在下面所做的那样工作,但是数组总是空的,因为它似乎在 for 循环完成之前就被使用了。我尝试了带有完成处理程序的 getNotifications()
函数,也尝试了 return 函数,但这两种方式仍然无效。我怎样才能等到 for 循环完成才能填充我的列表?或者如果有其他方法可以做到这一点,请告诉我,谢谢。
var notificationArray = [UNNotificationRequest]()
func getNotifications() {
print("getNotifications")
center.getPendingNotificationRequests(completionHandler: { requests in
for request in requests {
print(request.content.title)
notificationArray.append(request)
}
})
}
struct ListView: View {
var body: some View {
NavigationView {
List {
ForEach(notificationArray, id: \.content) { notification in
HStack {
VStack(alignment: .leading, spacing: 10) {
let notif = notification.content
Text(notif.title)
Text(notif.subtitle)
.opacity(0.5)
}
}
}
}
.onAppear() {
getNotifications()
}
}
}
更新:
以下是我添加新通知并再次调用 getNotifications
的方式。我希望列表在创建新数组时动态更新。打印到控制台显示 getNotifications
工作正常并且新数组包含添加的通知。
Section {
Button(action: {
print("Adding Notification: ", title, bodyText, timeIntValue[previewIndex])
addNotification(title: title, bodyText: bodyText, timeInt: timeIntValue[previewIndex])
showDetail = false
self.vm.getNotifications()
}) {
Text("Save Notification")
}
}.disabled(title.isEmpty || bodyText.isEmpty)
您的全局 notificationArray
未被视图观察到。它应该是动态的 属性...可能的解决方案是将其包装到 ObservableObject
视图模型中。
这里有一个解决方案演示:
class ViewModel: ObservableObject {
@Published var notificationArray = [UNNotificationRequest]()
func getNotifications() {
print("getNotifications")
center.getPendingNotificationRequests(completionHandler: { requests in
var newArray = [UNNotificationRequest]()
for request in requests {
print(request.content.title)
newArray.append(request)
}
DispatchQueue.main.async {
self.notificationArray = newArray
}
})
}
}
struct ListView: View {
@ObservedObject var vm = ViewModel()
//@StateObject var vm = ViewModel() // << for SwiftUI 2.0
var body: some View {
NavigationView {
List {
ForEach(vm.notificationArray, id: \.content) { notification in
HStack {
VStack(alignment: .leading, spacing: 10) {
let notif = notification.content
Text(notif.title)
Text(notif.subtitle)
.opacity(0.5)
}
}
}
}
.onAppear() {
self.vm.getNotifications()
}
}
}