如何解决将List / ScrollView与SFSafariViewController全屏工作表冲突
我正在尝试列出项目列表,每个项目都应以全屏方式打开带有SFSafariViewController的工作表。为了全屏显示SFSafariViewController,我使用了以下链接中的可用代码:https://dev.to/uchcode/web-sheet-with-sfsafariviewcontroller-4nlc。控制器工作得很好。但是,当我将项目放入List或ScrollView时,它不会显示工作表。当我删除List / ScrollView时,它工作正常。
这是代码。
elanlar = ['http://example.com/124124','http://example.com/523523']
csv_file = csv.reader(open('file.csv',"r"),delimiter=",")
for elan in elanlar:
for row in csv_file:
if len(row) <= 0:
pass
elif elan in row:
print(row[0])
else:
pass
解决方法
您的代码可在iOS 14模拟器中使用!
我包装了SFSafariViewController,并且如果用以下代码替换您的RootView
,则它可以在我的iOS 13设备上使用。但是,它并不是真正的全屏显示,而是一张纸。
struct RootView: View {
@State private var isPresenting = false
let address: String
let title: String
var body: some View {
Button(self.title) {
self.isPresenting.toggle()
}
.sheet(isPresented: self.$isPresenting) {
SafariView(address: URL(string: self.address)!)
}
}
}
struct SafariView: UIViewControllerRepresentable {
let address: URL
func makeUIViewController(context: Context) -> SFSafariViewController {
let config = SFSafariViewController.Configuration()
config.entersReaderIfAvailable = true
let safari = SFSafariViewController(url: self.address,configuration: config)
return safari
}
func updateUIViewController(_ uiViewController: SFSafariViewController,context: Context) {
//
}
}
,
下面是工作代码。
import SwiftUI
import SafariServices
struct ContentView: View {
var body: some View{
TabView {
HomeView()
.tabItem {
VStack {
Image(systemName: "house")
Text("Home")
}
}.tag(0)
ArticlesView().hosting()
.tabItem{
VStack{
Image(systemName: "quote.bubble")
Text("Articles")
}
}.tag(1)
}
}
}
struct HomeView: View {
var body: some View{
Text("This is home")
}
}
struct ShareView: View{
var body: some View{
Text("Here the share")
}
}
struct ArticlesView: View,Hostable {
@EnvironmentObject private var hostedObject: HostingObject<Self>
@State private var showShare = false
@State private var articlesList = [
ArticlesList(id: 0,title: "Apple",link: "http://apple.com",lang: "en"),ArticlesList(id: 1,title: "Yahoo",link: "http://yahoo.com",ArticlesList(id: 2,title: "microsoft",link: "http://microsoft.com",ArticlesList(id: 3,title: "Google",link: "http://google.com",lang: "en")
]
func present(address: String) {
let config = SFSafariViewController.Configuration()
config.entersReaderIfAvailable = true
let safari = SFSafariViewController(url: URL(string: address)!,configuration: config)
hostedObject.viewController?.present(safari,animated: true)
}
var body: some View {
NavigationView{
ScrollView(.vertical,showsIndicators: false) {
VStack(spacing: 40){
ForEach(articlesList) {article in
Button(article.title) {
self.present(address: article.link)
}
}
}
.sheet(isPresented: $showShare){
ShareView()
}
.navigationBarTitle("Articles")
.navigationBarItems(leading:
Button(action: {
self.showShare.toggle()
})
{
Image(systemName: "plus")
}
)
}
}
}
}
struct ArticlesList: Identifiable,Codable {
let id: Int
let title: String
let link: String
let lang: String
}
struct UIViewControllerView: UIViewControllerRepresentable {
final class ViewController: UIViewController {
var didAppear: (UIViewController) -> Void = { _ in }
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
didAppear(self)
}
}
var didAppear: (UIViewController) -> Void
func makeUIViewController(context: Context) -> UIViewController {
let viewController = ViewController()
viewController.didAppear = didAppear
return viewController
}
func updateUIViewController(_ uiViewController: UIViewController,context: Context) {
//
}
}
struct UIViewControllerViewModifier: ViewModifier {
var didAppear: (UIViewController) -> Void
var viewControllerView: some View {
UIViewControllerView(didAppear:didAppear).frame(width:0,height:0)
}
func body(content: Content) -> some View {
content.background(viewControllerView)
}
}
extension View {
func uiViewController(didAppear: @escaping (UIViewController) -> ()) -> some View {
modifier(UIViewControllerViewModifier(didAppear:didAppear))
}
}
class HostingObject<Content: View>: ObservableObject {
@Published var viewController: UIViewController? = nil
}
struct HostingObjectView<Content: View>: View {
var rootView: Content
let hostedObject = HostingObject<Content>()
func getHost(viewController: UIViewController) {
hostedObject.viewController = viewController.parent
}
var body: some View {
rootView
.uiViewController(didAppear: getHost(viewController:))
.environmentObject(hostedObject)
}
}
protocol Hostable: View {
associatedtype Content: View
func hosting() -> Content
}
extension Hostable {
func hosting() -> some View {
HostingObjectView(rootView: self)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。