// Use a HSHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
//This is the only change from the standard boilerplate
window.rootViewController = HSHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
struct MyView: View {
@State private var isSafariShown = false
var body: some View {
Button("Show Safari") {
self.isSafariShown = true
}
.background(
ViewControllerBridge(isActive: $isSafariShown) { vc, active in
if active {
let safariVC = SFSafariViewController(url: URL(string: "https://google.com")!)
vc.present(safariVC, animated: true) {
// Set the variable to false when the user dismisses the safari VC
self.isSafariShown = false
}
}
}
.frame(width: 0, height: 0)
)
}
}
8条答案
按热度按时间bxpogfeg1#
Matteo Pacini post,
.presentation(Modal())
was removed by iOS 13's release的补充。此代码应该可以工作(在Xcode 11.3,iOS 13.0 - 13.3中测试):daupos2t2#
SFSafariViewController
是一个UIKit
组件,因此您需要将其设置为UIViewControllerRepresentable
。有关如何将
UIKit
组件桥接到SwiftUI
的更多详细信息,请参见Integrating SwiftUI WWDC 19视频。提醒一下:
SFSafariViewController
应该显示在另一个视图控制器的顶部,而不是推入导航堆栈。它还有一个导航栏,这意味着如果你按下视图控制器,你会看到两个导航栏。
它似乎工作-虽然它的小故障-如果提出模态。
它看起来像这样:
我建议通过
UIViewRepresentable
协议将WKWebView
移植到SwiftUI
,并使用它来代替。t8e9dugd3#
使用**BetterSafariView**,你可以很容易地在SwiftUI中显示
SFSafariViewController
。它可以很好地按照苹果的意图工作,而不会失去它最初的推送过渡和滑动解除手势。用法
示例
os8fio9y4#
有时候,答案就是不使用SwiftUI!UIKit对SwiftUI的支持非常好,所以我只需要简单地搭建一个到UIKit的桥梁,这样我就可以在SwiftUI的一行中调用SafariController,如下所示:
我只是将应用顶层的UIHostingController替换为HSHostingController
(note- 此类还允许您控制模态的表示样式)
在场景代理中使用HSHostingController而不是UIHostingController,如下所示:
那么当你想打开SFSafariViewController的时候,调用:
例如
更新:请参阅this gist以了解具有附加功能的扩展解决方案
xurqigkl5#
这里是答案,如果使用WKWebView,但它仍然看起来不正确.
pgpifvop6#
这在SwiftUI中是可能的,甚至可以保留默认外观,但您需要公开一个UIViewController来使用。首先定义一个SwiftUI UIViewControllerRepresentable,它被传递了一个布尔绑定和一个激活处理程序:
然后,从一个状态属性中给予您计划显示SafariVC的小部件,该状态属性确定是否应该显示该小部件,然后添加此桥以在状态更改时显示VC。
请注意,我给予ViewControllerBridge一个宽度和高度为零的固定框架,这意味着您可以将其放在视图层次结构中的任何位置,并且不会对您的UI造成任何重大更改。
--雅各布
jchrr9hc7#
以上这些对我来说都不起作用,因为我试图在一个按钮列表中呈现SFSafariViewController。我最终使用了绑定。
在视图控制器中进行绑定:
SwiftUI列表:
xvw2m8pv8#
由于这里的大多数(如果不是全部)答案都集中在SwiftUI中
SFSafariViewController
的模态表示上,这里有一个将其推送到NavigationView
堆栈的示例(沿着在Safari中点击系统“Done”按钮时使“pop”工作):