繁体   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