Как ввести текст в конкретный TextField при использовании в проекте event.keyCode
В проекте используется слушатель клавиатуры. При создании текстового поля TextField невозможно ввести текст. В функции registerKeyHandler() специально установлен return nil а не return $0 - отключаю звуки от клавиатуры. Вопрос: Как для конкретного TextField сделать ввод текста?
import SwiftUI
import Foundation
import Carbon
class Answer: ObservableObject, Identifiable {
let id = UUID()
@Published var answerYes: Bool?
@Published var circleStroke: Bool
init(answerYes: Bool?, circleStroke: Bool) {
self.answerYes = answerYes
self.circleStroke = circleStroke
}
}
class Answers: ObservableObject {
@Published var items = [Answer]()
init(_ items: [Answer]) {
self.items = items
}
}
struct ContentView: View {
@ObservedObject var answers: Answers
@State var firstName = ""
@State var secondName = ""
var body: some View {
VStack {
Spacer()
HStack {
ForEach(answers.items) { item in
CircleView(answer: item)
}
}
.frame(width: 600, height: 200, alignment: .center)
Spacer()
TextField("Ваше Имя", text: $firstName)
.frame(width: 200, height: 30)
TextField("Ваша Фамилия", text: $secondName)
.frame(width: 200, height: 30)
Button("СОХРАНИТЬ") {
// action
}
Spacer()
Text("Перемещение по вопросам: Курсор <- -> ")
Text("Ответ на вопрос клавиши: 1 - Yes, 2 - No ")
Spacer()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(answers: Answers([]))
}
}
struct CircleView: View {
@ObservedObject var answer: Answer
var body: some View {
VStack {
Text("Вопрос:")
.padding(.bottom, 60)
// buttons
HStack {
HStack {
Button("Yes") {
answer.answerYes = true
}
Button("No") {
answer.answerYes = false
}
}
}
// circle
ZStack {
Circle()
.fill(Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)))
.frame(width: 120, height: 120)
.shadow(color: .black, radius: 2, x: 3, y: 3)
.opacity(answer.circleStroke ? 1 : 0)
Circle()
.fill(Color.yellow)
.frame(width: 100, height: 100)
.shadow(color: .black, radius: 2, x: 3, y: 3)
Text(answer.answerYes == nil ? "" : answer.answerYes! ? "yes" : "no")
.foregroundColor(Color(#colorLiteral(red: 0.8039215686, green: 0.5215686275, blue: 0.09803921569, alpha: 1)))
.font(.system(size: 40))
.offset(y: -5)
.opacity(answer.answerYes == nil ? 0 : 1)
}
}
}
}
AppDelegate
import Cocoa
import SwiftUI
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
var handler: AnswerKeysHandler!
// Количество кругов в массиве:
var circleCount = 4
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Массив кругов
var circles: [Answer] = []
// Добавляем в массив
for _ in 0..<circleCount {
let add = Answer(answerYes: nil, circleStroke: false)
circles.append(add)
}
circles[0].circleStroke = true
print(circles.count)
let answer1 = Answers(circles)
let contentView = ContentView(answers: answer1)
handler = AnswerKeysHandler(answers: answer1)
// Create the window and set the content view.
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.isReleasedWhenClosed = false
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: contentView)
window.makeKeyAndOrderFront(nil)
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
}
AnswerKeysHandler
import SwiftUI
import Foundation
import Carbon
var currentCircle = 0
struct AnswerKeysHandler {
@ObservedObject var answers: Answers
init(answers: Answers) {
self.answers = answers
registerKeysHandler()
}
private func registerKeysHandlerEnter() {
NSEvent.addLocalMonitorForEvents(matching: .keyDown) {
self.keyDown(with: $0)
return $0
}
}
private func registerKeysHandler() {
NSEvent.addLocalMonitorForEvents(matching: .keyDown) {
self.keyDown(with: $0)
return nil
}
NSEvent.addLocalMonitorForEvents(matching: .keyUp) {
self.keyUp(with: $0)
return nil
}
}
private func keyUp(with event: NSEvent) {
}
private func keyDown(with event: NSEvent) {
switch event.keyCode {
case 123:
currentCircle -= 1
for index in answers.items {
index.circleStroke = false
}
if currentCircle <= answers.items.endIndex && currentCircle >= 0 {
answers.items[currentCircle].circleStroke = true
} else {
currentCircle = answers.items.endIndex - 1
answers.items[currentCircle].circleStroke = true
}
case 124:
currentCircle += 1
for index in answers.items {
index.circleStroke = false
}
if currentCircle < answers.items.endIndex {
answers.items[currentCircle].circleStroke = true
} else {
currentCircle = 0
answers.items[currentCircle].circleStroke = true
}
case 18:
answers.items[currentCircle].answerYes = true
case 19:
answers.items[currentCircle].answerYes = false
default:
print("key pressed with code \(event.keyCode)")
}
}
}