将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)
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...