Так. Я пытаюсь увеличить количество символов под моим текстовым полем на экране, но оно не увеличивается - PullRequest
0 голосов
/ 24 января 2020

Итак. Я пытаюсь увеличить количество символов под моим текстовым полем на экране, но оно не увеличивается. Я пытался заставить его работать последние пару часов и, похоже, не могу этого понять. Есть ли способ заставить эту работу работать так, как я хочу? Или это не сработает, потому что я использую TextFieldWrapperView?

import SwiftUI

struct ContentView: View {

    @State var emojiText = ""


    var body: some View {
        VStack(spacing: 10) {
            Text("Emoji Pad:")
                .font(.body)
                .foregroundColor(.gray)

            TextFieldWrapperView(text: self.$emojiText)
                .background(Color.gray)
                .frame(width: 200, height: 50)
            Text("\(emojiText.count)")
        }
        .frame(height: 40)
    }
}


struct TextFieldWrapperView: UIViewRepresentable {

    @Binding var text: String

    func makeCoordinator() -> TFCoordinator {
        TFCoordinator(self)
    }
}

extension TextFieldWrapperView {


    func makeUIView(context: UIViewRepresentableContext<TextFieldWrapperView>) -> UITextField {
        let textField = EmojiTextField()
        textField.delegate = context.coordinator
        return textField
    }


    func updateUIView(_ uiView: UITextField, context: Context) {

    }
}

class TFCoordinator: NSObject, UITextFieldDelegate {
    var parent: TextFieldWrapperView

    init(_ textField: TextFieldWrapperView) {
        self.parent = textField
    }

    //        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    //            if let value = textField.text {
    //                parent.text = value
    //                parent.onChange?(value)
    //            }
    //
    //            return true
    //        }
}


class EmojiTextField: UITextField {

    // required for iOS 13
    override var textInputContextIdentifier: String? { "" } // return non-nil to show the Emoji keyboard ¯\_(ツ)_/¯

    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
}

struct EmojiTF_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

1 Ответ

1 голос

Вы оставили комментарий с комментариями в UITextFieldDelegate, но это именно то, что вам нужно. Я немного обновляю его, потому что при удалении текста из текстового поля возникает ошибка. Просто замените ваш class TFCoordinator следующим:

class TFCoordinator: NSObject, UITextFieldDelegate {
    var parent: TextFieldWrapperView

    init(_ textField: TextFieldWrapperView) {
        self.parent = textField
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        if let value = textField.text, charIsBackSpace(string) {
            let stringWithoutLastChar = value.dropLast()
            parent.text = String(stringWithoutLastChar)
        } else if let value = textField.text {
            parent.text = value + string
        } else {
            parent.text = string
        }

        return true
    }

    private func charIsBackSpace(_ string: String) -> Bool {
        guard let char = string.cString(using: String.Encoding.utf8) else { return false }
        let charCode = strcmp(char, "\\b")
        let backSpaceCode = -92
        return charCode == backSpaceCode
    }

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