![](/img/trans.png)
[英].gitattributes for linguist doesn't work correctly with gitlab
[英]Swift message alert exit button doesn't work
我正在创建一个应用程序,用户根据他拥有的权限可以访问各种视图。
我使用这种方法不断检查用户权限:
func checkPermission() {
let docRef = self.DatabaseFirestore.collection("Admins").document(phoneNumber)
docRef.getDocument{(document, error) in
guard error == nil else {
return
}
if let document = document, document.exists {
self.controlloAdmin = true
guard let data = document.data() else {
print("Document data was empty.")
return
}
self.permission = data["Permessi"] as? [Bool] ?? []
} else {
self.controlloAdmin = false
self.isRegistred = false
self.access = false
}
}
}
我不知道它是否是我可以使用的最正确的 function,但它是我发现有效的少数几个之一。
这是我的看法:
struct AdministratorPage: View {
@StateObject var administratorManager = AdministratorManager()
// User variables.
@AppStorage("phoneNumber") var phoneNumber: String = "" // User number.
@AppStorage("Access") var access: Bool = false
var body: some View {
administratorManager.checkPermission()
return NavigationView {
HStack {
VStack {
Text("Home")
Text(phoneNumber)
// Button to log out.
Button("Logout", action: {
self.access = false
})
Button("Alert", action: {
administratorManager.message = "Error title!"
administratorManager.message = "Error message!"
administratorManager.isMessage = true
}).alert(isPresented: $administratorManager.isMessage) {
Alert(title: Text(administratorManager.title), message: Text(administratorManager.message),
dismissButton: .default(Text("Ho capito!")))
}
}
}
}
}
}
当我调用“administratorManager.checkPermission()”function 并按下“警报”按钮时,会显示消息,但即使按下按钮,警报也不会消失。 如果我不调用这个 function,一切正常。
我该如何解决? 可以针对 firebase 发出警报 go 吗? 有没有更合适的方法来只读取一个数据?
我运行了你的代码,我看到了你描述的行为。 原因是在正文中直接调用了 function。
如果您想在打开视图时调用 function,请为该特定视图使用.onAppear function。 在你的情况下
.onAppear {
administratorManager.checkPermission()
}
以下(与您一起为我工作的代码):
struct AdministratorPage: View {
@StateObject var administratorManager = AdministratorManager()
// User variables.
@AppStorage("phoneNumber") var phoneNumber: String = "" // User number.
@AppStorage("Access") var access: Bool = false
var body: some View {
return NavigationView {
HStack {
VStack {
Text("Home")
Text(phoneNumber)
// Button to log out.
Button("Logout", action: {
self.access = false
})
Button("Alert", action: {
administratorManager.message = "Error title!"
administratorManager.message = "Error message!"
administratorManager.isMessage = true
}).alert(isPresented: $administratorManager.isMessage) {
Alert(title: Text(administratorManager.title), message: Text(administratorManager.message),
dismissButton: .default(Text("Ho capito!")))
}
}
}
}
.onAppear {
administratorManager.checkPermission()
}
}
}
您最初的方法是进行一种轮询,它不断地调用 function。 请记住,当您提出 Firebase 请求时,您需要为您返回的文件付费。 如果您进行投票,您会多次获得相同的文档,并且会为此付费。
在这个答案中使用我上面提到的示例,您只需调用 function 一次。 如果您现在想从 Firestore 获取实时更新,您可以添加一个快照侦听器。 方法是:
func checkPermission() {
let docRef = db.collection("Admins").document(phoneNumber).addSnapshotListener() { documentSnapshot, error in //erca nella collezione se c'è il numero.
guard error == nil else {
print("ERROR.")
return
}
if let document = documentSnapshot {
self.controlloAdmin = true
guard let data = document.data() else {
print("Document data was empty.")
return
}
self.permission = data["Permessi"] as? [Bool] ?? []
} else {
self.controlloAdmin = false
self.isRegistred = false
self.access = false
}
}
}
每当 Friestore 中该文档的值发生更改时,它也会在您的设备上发生更改。
最好的,塞巴斯蒂安
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.