Я новичок в SwiftUI и разработке приложений на XCode. У меня хороший опыт работы с другими языками, но мне трудно уяснить некоторые вещи.
По сути, у меня есть ViewModel, настроенный как API для получения уведомлений с моего сервера, как показано ниже:
import Foundation
import SwiftUI
class NotificationsAPI: ObservableObject {
@Published var notifications: [KXNotification] = []
let userId = [something here]
func fetch() {
guard let url = URL(string: "xxxxxx.php?id=userId") else {
return
}
let task = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in guard let data = data, error == nil else {
return
}
//Convert to JSON
do {
let notifications = try JSONDecoder().decode([KXNotification].self, from: data)
DispatchQueue.main.async {
self?.notifications = notifications
}
} catch {
print(error)
}
}
task.resume()
}
}
В моем основном представлении у меня есть приведенное ниже, но мне нужно передать «userId» в модель представления NotificationsAPI в этом представлении, чтобы она передавала правильные уведомления с сервера.
import SwiftUI
struct NotificationsView: View {
@StateObject var viewModel = NotificationsAPI()
var body: some View {
VStack(alignment: .center, spacing: 16) {
VStack(alignment: .leading, spacing: 8) {
HStack(alignment: .bottom, spacing: 0) {
Text("Notifications")
.font(.poppins(size: 20, weight: .medium))
Spacer(minLength: 0)
Text("View All")
.font(.poppins(size: 15, weight: .medium))
.themeForegroundColor(\.gray2)
.onTapNavigate(to: AllExercisesView())
}
Text("Notifications: \(viewModel.notifications.count)")
.font(.openSans(size: 12, weight: .regular))
}
VStack(alignment: .center, spacing: 16) {
ForEach(viewModel.notifications, id: \.self) { notification in
LongCardView(
image: .web(link: notification.notificationImage),
title: notification.notificationTitle,
subTitle: notification.notificationDate,
icon: "i_icon"
)
}
}
.onAppear {
viewModel.fetch()
}
}
}
}
Заранее спасибо.
Я пробовал несколько методов, но изо всех сил пытался заставить их работать. Был бы очень признателен за некоторые рекомендации.
Здесь у вас есть несколько вариантов.
Вы можете передать параметр методу fetch(). Так это будет выглядеть func fetch(userId: String(or whatever type you have)
.
О том, как работают параметры в функциях, вы можете узнать в документации: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/functions/.
В качестве второго варианта вы можете инициализировать свою модель представления с помощью userId. Об инициализации можно прочитать в документации: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/initialization. Или попросите
Первый вариант гораздо проще и предпочтительнее.
Кажется, у вас тоже нет
userid
в вашем представлении, но если бы вы это сделали, вы могли бы просто сказатьfetch(userid)
т.е. измените методfetch
, чтобы он принимал аргументuserid
.