簡體   English   中英

Swift 消息警報退出按鈕不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM