如何在 SwiftUI 中使用 Toast-Swift?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中使用 Toast-Swift?【英文标题】:How to use Toast-Swift in SwiftUI? 【发布时间】:2020-06-01 01:06:49 【问题描述】:

我想在 SwiftUI 视图中通过 CocoaPods 使用这个项目 Toast-Swift。是针对 UIView 的,所以我试着写了一个 ViewController 并把它包装到 SwiftUI 中,结果屏幕上什么都没有。

我的代码:

struct ToastView: UIViewControllerRepresentable

    @State var text: String

    func makeUIViewController(context: UIViewControllerRepresentableContext<ToastView>) -> UIToast 
        return UIToast(text: text)
    

    func updateUIViewController(_ uiViewController: UIToast, context: UIViewControllerRepresentableContext<ToastView>) 

    


class UIToast: UIViewController

    var text: String = ""

    init(text: String) 
        super.init(nibName: nil, bundle: nil)
        self.text = text
    

    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    override func viewDidLoad() 
        super.viewDidLoad()
        self.view.makeToast(text)
    

我在 Toast for SwiftUI (SO question) 的 SO 上找到了一些自定义实现,但它们的行为并不完全符合我的要求。

有人可以帮我解决这个问题吗? SwiftUI 中的 Toast 还有其他推荐吗?提前致谢!

【问题讨论】:

***.com/questions/68471684/… 【参考方案1】:

我把它放在这里是为了那些仍在使用 SwiftUI 寻找这个主题的人:

https://github.com/elai950/AlertToast

struct ContentView: View

    @State private var showAlert = false

    var body: some View
        VStack

            Button("Show Alert")
                 showAlert.toggle()
            
        
        .toast(isPresenting: $showAlert)

            // `.alert` is the default displayMode
            AlertToast(displayMode: .alert, type: .regular, title: "Message Sent!")
            
            //Choose .hud to toast alert from the top of the screen
            //AlertToast(displayMode: .hud, type: .regular, title: "Message Sent!")
        
    

【讨论】:

【参考方案2】:

我不知道您是否已经解决了您的问题,但我将其发布在这里以防有人感兴趣。我设法做到这一点,获得对 SceneManager 的引用,然后使用它的 rootViewController 视图。使用此视图,您可以使用 Toast_Swift 示例:

Button(action: 
                 let scene = UIApplication.shared.connectedScenes.first
                 if let sceneDelegate : SceneDelegate = scene?.delegate as? SceneDelegate
                    if let view = sceneDelegate.window?.rootViewController?.view
                      view.makeToast("Text")
                  
              
//...

希望对你有帮助。

【讨论】:

我无法解决。我试图在警报中使用其他一些方法,但不如 Toast 好。您的解决方案运行良好,感谢您的帮助!【参考方案3】:

尝试使用这个开源:https://github.com/huynguyencong/ToastSwiftUI。我发现它非常好用。

struct ContentView: View 
    @State private var isShowingToast = false
    
    var body: some View 
        VStack(spacing: 20) 
            Button("Show toast") 
                self.isShowingToast = true
            
            
            Spacer()
        
        .padding()

        // Just add a modifier to show a toast, with binding variable to control
        .toast(isPresenting: $isShowingToast, dismissType: .after(3)) 
            ToastView(message: "Hello world!", icon: .info)
        
    

【讨论】:

以上是关于如何在 SwiftUI 中使用 Toast-Swift?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIkit 中添加 SwiftUI 对象

如何在 SwiftUI 中使用 SFSafariViewController?

如何在 swiftUI 视图中使用按钮? [关闭]

如何在 SwiftUI 中使用 .fileimporter 保存音频文件并检索文件并在 SwiftUI 列表中显示它们的文件名?

如何在 Xcode Playground 中使用 SwiftUI?

如何在 SwiftUI 中使用渐变填充形状