SwiftUI in target (пользовательская клавиатура) - PullRequest
0 голосов
/ 23 января 2020

Не удается найти пример использования SwiftUI в расширении клавиатуры. Я создаю расширение и пытаюсь создать простой SwiftUI Button без каких-либо действий (он просто печатает отладочный текст). Но на клавиатуре нет видимой кнопки. Можно ли создать собственную клавиатуру SwiftUI?

struct SwiftUIButton: View{
    let action: () -> ()
    var body: some View{
        Button(action: action){Text("Tap me")}
    }
}

class KeyboardViewController: UIInputViewController {

    @IBOutlet var nextKeyboardButton: UIButton!


//1.insert this: SwiftUIButton is a simple Button View
    var swiftUIButtonView: SwiftUIButton!
    //...
    override func viewDidLoad() {
        super.viewDidLoad()


        // Perform custom UI setup here

        //2. try to insert my SwiftUI View
        let swiftUIButtonView = SwiftUIButton(action: {print("test")})
        let vc = UIHostingController(rootView: swiftUIButtonView)
        //I tried that with no success
        //guard let inputView = inputView else { return }
        //inputView.addSubview(vc.view)
        self.view.addSubview(vc.view)

        //all that following code is standard from Xcode
        self.nextKeyboardButton = UIButton(type: .system)

        self.nextKeyboardButton.setTitle(NSLocalizedString("Next Keyboard", comment: "Title for 'Next Keyboard' button"), for: [])
        self.nextKeyboardButton.sizeToFit()
        self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = false

        self.nextKeyboardButton.addTarget(self, action: #selector(handleInputModeList(from:with:)), for: .allTouchEvents)

        self.view.addSubview(self.nextKeyboardButton)

        self.nextKeyboardButton.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
        self.nextKeyboardButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
    }

Когда я пытаюсь протестировать ее в симуляторе, я вижу пустую клавиатуру

enter image description here

и некоторые ошибки в консоли отладки:

2020-01-23 02: 07: 13.421876 + 0300 SwiftUIKeyboard [4723: 376225] Не удалось унаследовать разрешения CoreMedia от 4717: (null) 2020-01 -23

02: 07: 13.460713 + 0300 SwiftUIKeyboard [4723: 375598] [Внешний] - [UIInputViewController needsInputModeSwitchKey] был вызван до того, как было установлено соединение с приложением хоста. Это приведет к неточному результату. Обязательно вызывайте его после инициализации основного контроллера вида.

последнее сообщение повторяется 6 раз.

Что я делаю не так? Или мне нужно создать UIKit Keyboard View и реализовать SwiftUI внутри него?

1 Ответ

0 голосов
/ 23 января 2020

о, это было трудно для UIKit, но я сделал это.

    // Perform custom UI setup here
    let child = UIHostingController(rootView: SwiftUIButton())
    //that's wrong, it must be true to make flexible constraints work
   // child.translatesAutoresizingMaskIntoConstraints = false
    child.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.addSubview(child.view)
    addChild(child)//not sure what is this for, it works without it.

отлично работает. Даже GeometryReader внутри SwiftUI View хорошо работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...