如何在SwiftUI中创建键盘应用程序扩展?

3

我是SwiftUI的新手。我需要在SwiftUI中创建一个键盘扩展程序。我无法找到如何实现它的方法。我在网上搜索了一整天,但仍然找不到如何实现它。

这里是我编写的一些代码:

struct ContentView: View {
    var body: some View {
        VStack{
           
            keyboard()
        }
        
    }
}

struct keyboard: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> UIInputViewController {
        let inputVC = UIInputViewController()
        return inputVC
    }
    
    func updateUIViewController(_ uiViewController: UIInputViewController, context: Context) {
        print("some text")
    }
     
} 

上述代码是在扩展文件夹的keyboardViewController.swift文件中编写的,但没有显示任何键盘。
如果我在同一文件中编写UIKit UIInputController代码(当我们创建扩展时自动生成的文件),那么只有在这种情况下才能看到键盘扩展出现。
我想设计一个类似于UIKit Inputviewcontroller类型的键盘,然后使用UIViewControllerRepresentable在SwiftUI contentview中显示它。
现在我的问题是->这种方法正确吗?如果是,请指导我向前。如果不是,请建议我正确的方法。
提前感谢!

我不确定是否可以完全使用SwiftUI创建一个键盘扩展。我建议先在UIKit中创建一个,这样你就能掌握它们的工作原理。这里有一个关于如何在UIKit中创建键盘扩展的教程:https://www.raywenderlich.com/49-custom-keyboard-extensions-getting-started。我对键盘扩展的理解是,它们的代码必须包含在你创建的扩展中。 - Andrew
@Andrew 谢谢回复。所以,我觉得我的方法不对。如果我使用这种方法:-> 我应该使用 SwiftUI 设计键盘按钮,然后在 Inputviewcontroller 中使用 UIHostingController 调用它。?? 我还是有点困惑,请告诉我。 - swiftDev
可能会起作用。但正如我所说的,你可能首先想在UIKit上尝试一下,这样你就能理解如何创建自定义键盘扩展,然后再看看你可以做哪些改变以适应SwiftUI。 - Andrew
@Andrew ... 嗯,好的,那让我试验一下,很快我会更新我的问题并告诉你我得到了什么。 - swiftDev
1个回答

6

以下是使用UIHostingController的方法:

当我添加了一个新的目标“键盘”作为键盘扩展时,XCode自动生成了一个名为KeyboardViewController的类:

class KeyboardViewController: UIInputViewController {
    // some code
    override func viewDidLoad() {
        super.viewDidLoad()
        self.nextKeyboardButton = UIButton(type: .system)
        // some code
    }
    // some code
}

我通过UIHostingController将我的键盘视图作为rootView添加到了视图中。然后将其及其视图作为KeyboardViewControllerKeyboardViewController视图的子视图添加到了其中:

class KeyboardViewController: UIInputViewController {
    // some code
    override func viewDidLoad() {
        super.viewDidLoad()
        let hostingController = UIHostingController(rootView: KeyboardView(viewController: self))
        view.addSubview(hostingController.view)
        addChild(hostingController)

        self.nextKeyboardButton = UIButton(type: .system)
        // some code
    }
    // some code
}

我的键盘视图就像这样:

struct KeyboardView: View {
    var viewController: KeyboardViewController
    var body: some View {
        // some view as you designed
    }
}

它对我有用。


2
我最初期望包含UIHostingController的视图被设置为类似于自动调整大小的约束,但是似乎我需要添加一行代码:hostingController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]。如果有其他更喜欢的设置大小约束的方法,请随时分享。 - Luke Walsh
你是如何处理 KeyboardView 中的 PreviewProvider 的? - Luke Walsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接