7

出于某种原因,以下代码显示了具有相同按钮的三个实例的警报,但没有一个按预期触发操作(例如,只是一个简单的控制台输出):

警报中的重复按钮

有没有其他人经历过这个?关于修复的任何建议?

它基于 Xcode 11.2.1 构建,用于 iOS 13.0 目标,然后通过 Catalyst 在 macOS (10.15.1) 上运行。

更新 1:这似乎是 Catalyst 特有的问题。当相同的代码在 iPhone 模拟器上运行时,它会显示一个按钮并按预期执行操作。

更新 2:更新到 Xcode 11.3.1 和 macOS 10.15.3 也没有解决这个问题。

public struct ContactUsView: View {
    
    @ObservedObject private var contactUsVM: ContactUsViewModel
    
    private var successAlert: Alert {
        Alert(
            title: Text("Email Sent"),
            message: Text("Thanks for taking the time to reach out to us. We appreciate it!"),
            dismissButton: .default(Text("OK")) {
                self.dismissSelf()
            }
        )
    }
    
    public var body: some View {
        Form {
            // ...
        }
        .alert(isPresented: self.$contactUsVM.contactAttemptSucceeded) {
            self.successAlert
        }
    }

    public init() {
        self.contactUsVM = ContactUsViewModel()
    }
    
    private func dismissSelf() {
        print("Dismissing!")
    }
}

class ContactUsViewModel: ObservableObject {

    @Published var contactAttemptSucceeded: Bool = true
}
4

3 回答 3

1

看来您的代码在xCode 11.5 MacOs 0.15.4上运行良好。如果您运行您的示例(我刚刚填补了代码中的漏洞):

import SwiftUI

public struct ContactUsView: View {

    @ObservedObject private var contactUsVM: ContactUsViewModel

    private var successAlert: Alert {
        Alert(
            title: Text("Email Sent"),
            message: Text("Thanks for taking the time to reach out to us. We appreciate it!"),
            dismissButton: .default(Text("OK")) {
                self.dismissSelf()
            }
        )
    }

    public var body: some View {
        Form {
            Text("Hello World")
        }
        .alert(isPresented: self.$contactUsVM.contactAttemptSucceeded) {
            self.successAlert
        }
    }

    public init() {
        self.contactUsVM = ContactUsViewModel()
    }

    private func dismissSelf() {
        print("Dismissing!")
    }
}

class ContactUsViewModel: ObservableObject {

    @Published var contactAttemptSucceeded: Bool = true
}

你会看到这个:

在此处输入图像描述

于 2020-05-28T09:38:15.597 回答
1

这似乎已在 macOS Big Sur 上修复。不幸的是,对于那些需要支持 macOS Catalina(包括我)的人来说,唯一的解决方法是使用 UIAlertController 创建警报。

我这样做的方式是将通知发送到SceneDelegate实例,并显示UIAlertControllerUIHostingController

NotificationCenter.default.addObserver(forName: .showMailUnavailableAlert, object: nil, queue: nil) { [weak self] _ in
    let controller = UIAlertController(title: "Default email client is not configured.", preferredStyle: .alert)
    controller.addAction(.init(title: "Ok", style: .cancel, handler: nil))
    self?.window?.rootViewController?.present(controller, animated: true, completion: nil)
}

extension NSNotification.Name {
    static let showMailUnavailableAlert = NSNotification.Name("Email not configured.")
}
于 2020-12-03T15:48:33.977 回答
0

我不知道如何修复重复的按钮,但要让警报解除,您可能需要在 ObservedObject 行下添加此行:

@Environment(\.presentationMode) var presentationMode

然后添加:

presentationMode.wrappedValue.dismiss()

到您的dismissSelf() 函数。

这是我从 Paul Hudson 的 Hacking Swift 视频中收集到的。

于 2020-05-21T20:03:28.420 回答