swiftui fileimporteruihostingController

问题描述 投票:0回答:0
appdelegate.h

#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> {} @property (strong, nonatomic) UIWindow *window; @end

appdelegate.m

#import "AppDelegate.h" #import "MyApp-Swift.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; FirstViewBuilder *viewBuilder = [[FirstViewBuilder alloc] init]; [viewBuilder show]; return YES; } @end

FirstViewBuilder.Swift
import SwiftUI

@objc class FirstViewBuilder: NSObject {
    
    private var view: UIHostingController<FirstView>

    @objc override init() {
        self.view = MyHostingController(rootView: FirstView())
    }

    @objc func show() {
        
        let app = UIApplication.shared.delegate as? AppDelegate
        let window = app?.window
        window?.backgroundColor = .white
        // Use navigationController or view directly depending on use
        window?.rootViewController = view
    }
}

firstView.swift
import SwiftUI

struct FirstView: View {
    
    @State var hasToOpenFilesApp = false
    
    var body: some View {

        VStack(alignment: .leading, spacing: 0) {
            
            Button("Open Files app") {
                hasToOpenFilesApp = true
            }.fileImporter(isPresented: $hasToOpenFilesApp, allowedContentTypes: [.text]) { result in
                switch result {
                case .success(let url):
                    print(url.debugDescription)
                case .failure(let error):
                    print(error.localizedDescription)
                }
            }
        }
    }
}

最后,MyHostingController
import SwiftUI

class MyHostingController<Content>: UIHostingController<Content> where Content: View {
    
    override init(rootView: Content) {
        super.init(rootView: rootView)
    }
    
    @objc required dynamic init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.hidesBackButton = true
    }
}

在iPhone 13 Pro(18.2)模拟器中启动此功能并打开文件选择器(需要几秒钟)。
它没有响应任何触摸,该应用程序被冻结,我必须杀死它。

I仅使用此独特的视图创建了一个新鲜的Swiftui项目,并且FileImport按预期工作,因此我认为问题是由于将SwiftUi视图嵌入了UihostingController中。 因此,我对最小项目进行了这些修改:

将文件appdelegate,firstViewBuilder和myHostingController删除。

创建此SwiftUi应用程序文件

file picker failed

import SwiftUI @main struct MyApp: App { var body: some Scene { WindowGroup { FirstView() } } }

ios再次出现同样的问题18.

    但是,如果我在iPhone 13 Pro(17.4)模拟器中启动此确切的项目并打开文件应用程序(现在几乎可以立即打开),它可以正常运行,并按照预期显示了这一点,并且可以与之交互并选择文件:
  • 我尝试过的last this是从我的项目和启动屏幕界面文件base name键中删除infunscreen.xib。
  • 我猜想这一定是由于我的项目配置(太旧),但我不再对在哪里看的想法。
  • 有一个新的Swiftui项目并将旧项目“移动”到新项目的可能性可能会带我几个星期,而我暂时将其丢弃。
我可以使用另一种方法从iOS 18中从swiftui视图中选择文件?
	

对于iOS 18,您可以使用

DocumentGroup

DocumentGroupLaunchScenefile picker ok访问文件。考虑检查一下。

Source:

Https://developer.apple.com/documentation/swiftui/building-a-a-document-----基于-app-with-with-swiftui

ios swift swiftui uikit swiftui-fileimporter
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.