首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消包含在SwiftUI中的UIHostingController视图

取消包含在SwiftUI中的UIHostingController视图
EN

Stack Overflow用户
提问于 2019-07-24 20:06:45
回答 12查看 24.4K关注 0票数 48

我已经将我在视图控制器中的标志重写为SwiftUI ViewSignInView封装在一个UIHostingController子类(final class SignInViewController: UIHostingController<SignInView> {})中,并在需要登录时以全屏幕的方式显示。

一切都很好,除了我不知道如何将SignInViewControllerSignInView中剔除。我试着补充:

代码语言:javascript
复制
@Environment(\.isPresented) var isPresented

SignInView中,并在登录成功时将其分配给false,但这似乎不与UIKit互操作。我怎么能不去看风景呢?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2019-08-30 14:10:41

更新:来自iOS 15 beta 1的发行说明:

isPresented、PresentationMode和新的DismissAction操作取消了从UIKit中提供的主机控制器。(52556186)

最后,我找到了一个比所提供的更简单的解决方案:

代码语言:javascript
复制
final class SettingsViewController: UIHostingController<SettingsView> {
    required init?(coder: NSCoder) {
        super.init(coder: coder, rootView: SettingsView())
        rootView.dismiss = dismiss
    }

    func dismiss() {
        dismiss(animated: true, completion: nil)
    }
}

struct SettingsView: View {
    var dismiss: (() -> Void)?
    
    var body: some View {
        NavigationView {
            Form {
                Section {
                    Button("Dimiss", action: dismiss!)
                }
            }
            .navigationBarTitle("Settings")
        }
    }
}
票数 47
EN

Stack Overflow用户

发布于 2019-12-27 22:17:53

我发现了另一种似乎很有效的方法,它感觉比其他一些方法要干净一些。步骤:

  1. dismissAction属性添加到SwiftUI视图中:
代码语言:javascript
复制
struct SettingsUIView: View {
    var dismissAction: (() -> Void)
    ...
}    
  1. 当您想要关闭视图时,请调用dismissAction
代码语言:javascript
复制
Button(action: dismissAction ) {
    Text("Done")
}
  1. 当您呈现视图时,向它提供一个解雇处理程序:
代码语言:javascript
复制
let settingsView = SettingsUIView(dismissAction: {self.dismiss( animated: true, completion: nil )})
let settingsViewController = UIHostingController(rootView: settingsView )

present( settingsViewController, animated: true )
票数 50
EN

Stack Overflow用户

发布于 2019-12-15 21:52:10

这里提供的所有答案都不适用于我,可能是因为一些弱引用。这就是我想出的解决方案:

创建视图和UIHostingController:

代码语言:javascript
复制
let delegate = SheetDismisserProtocol()
let signInView = SignInView(delegate: delegate)
let host = UIHostingController(rootView: AnyView(signInView))
delegate.host = host
// Present the host modally 

SheetDismisserProtocol:

代码语言:javascript
复制
class SheetDismisserProtocol: ObservableObject {
    weak var host: UIHostingController<AnyView>? = nil

    func dismiss() {
        host?.dismiss(animated: true)
    }
}

必须驳回的观点:

代码语言:javascript
复制
struct SignInView: View {
    @ObservedObject var delegate: SheetDismisserProtocol

    var body: some View {
        Button(action: {
            self.delegate.dismiss()
        })
    }
}
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57190511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档