我已经将我在视图控制器中的标志重写为SwiftUI View。SignInView封装在一个UIHostingController子类(final class SignInViewController: UIHostingController<SignInView> {})中,并在需要登录时以全屏幕的方式显示。
一切都很好,除了我不知道如何将SignInViewController从SignInView中剔除。我试着补充:
@Environment(\.isPresented) var isPresented在SignInView中,并在登录成功时将其分配给false,但这似乎不与UIKit互操作。我怎么能不去看风景呢?
发布于 2019-08-30 14:10:41
更新:来自iOS 15 beta 1的发行说明:
isPresented、PresentationMode和新的DismissAction操作取消了从UIKit中提供的主机控制器。(52556186)
最后,我找到了一个比所提供的更简单的解决方案:
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")
}
}
}发布于 2019-12-27 22:17:53
我发现了另一种似乎很有效的方法,它感觉比其他一些方法要干净一些。步骤:
dismissAction属性添加到SwiftUI视图中:struct SettingsUIView: View {
var dismissAction: (() -> Void)
...
} dismissAction:Button(action: dismissAction ) {
Text("Done")
}let settingsView = SettingsUIView(dismissAction: {self.dismiss( animated: true, completion: nil )})
let settingsViewController = UIHostingController(rootView: settingsView )
present( settingsViewController, animated: true )发布于 2019-12-15 21:52:10
这里提供的所有答案都不适用于我,可能是因为一些弱引用。这就是我想出的解决方案:
创建视图和UIHostingController:
let delegate = SheetDismisserProtocol()
let signInView = SignInView(delegate: delegate)
let host = UIHostingController(rootView: AnyView(signInView))
delegate.host = host
// Present the host modally SheetDismisserProtocol:
class SheetDismisserProtocol: ObservableObject {
weak var host: UIHostingController<AnyView>? = nil
func dismiss() {
host?.dismiss(animated: true)
}
}必须驳回的观点:
struct SignInView: View {
@ObservedObject var delegate: SheetDismisserProtocol
var body: some View {
Button(action: {
self.delegate.dismiss()
})
}
}https://stackoverflow.com/questions/57190511
复制相似问题