![](/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.