根据您部署的最低 iOS 版本,您有两种选择:
如果您的最低 iOS 版本为 <= iOS 14,则在两者中都InfoView使用SettingsViewsystem environment \.presentationMode。
struct SettingsView: View {
@EnvironmentObject var model: MainModel
@Environment(\.presentationMode) private var presentationMode
var body: some View {
Button("Dismiss") {
/// ... Do something here prior to dismissing the sheet.
model.MyFunction(email: email, password: password) {
presentationMode.wrappedValue.dismiss()
}
}
}
}
在您的最低 iOS 版本上是 iOS 15,同时InfoView使用SettingsView系统环境\.dismiss。
struct SettingsView: View {
@EnvironmentObject var model: MainModel
@Environment(\.dismiss) private var dismiss
var body: some View {
Button("Dismiss") {
/// ... Do something here prior to dismissing the sheet.
model.MyFunction(email: email, password: password) {
dismiss()
}
}
}
}
和MainModel类:
class MainModel: ObservableObject {
func myFunction(email: String, password: String, onSuccess: (() -> Void)? = nil) {
auth.signIn(withEmail: email, password: password) { [weak self] result, error in
if result == nil, error != nil {
self?.showAlert = true
} else {
guard result != nil, error == nil else { return }
/* Success */
self?.signedIn = true
onSuccess?()
}
}
}
}
替代解决方案:
如果您的最低部署目标是 >= iOS 14,您可以像这样监听环境对象属性的更改:
struct SettingsView: View {
@EnvironmentObject var model: MainModel
@Environment(\.dismiss) private var dismiss
var body: some View {
Button("Dismiss") {
model.MyFunction(email: email, password: password)
}
.onChange(of: model.signedIn) { signedIn in
if signedIn {
dismiss()
}
}
}
}