SwiftUI: onCommit срабатывает, когда я щелкаю, а не нажимаю Return - PullRequest
0 голосов
/ 29 мая 2020

Я работаю с onCommit для текстового представления в SwiftUI (приложение предназначено для MacOS).

struct TextBlockView: View {
     @State private var content = ""
    var id = UUID()

       var body: some View {

        let block = MacEditorTextView(text: $content, onEditingChanged: {
            print("editing changed")
        }, onCommit: {
            Keystroke.keystroke.enterPressed = true
            print("add new textblock here")
            //trigger function to create next block
           }).multilineTextAlignment(.leading)
               .frame(minWidth: 300,
                      maxWidth: .infinity,
                      minHeight: 40,
                      maxHeight: .infinity)
                .focusable()

        let tag = Rectangle()
                    .fill(Color.init(red: 1.00, green: 0.95, blue: 0.80, opacity: 1))
                    .frame(width: 10, height: 10)


        return HStack {
            tag
            block
        }
       }
}

Требуемое действие происходит, когда пользователь щелкает от текстового блока (добавляется новый текстовый блок ). Однако я бы хотел, чтобы это действие выполнялось, когда пользователь нажимает return. Это работало примерно 30 минут, когда я впервые написал код для onCommit, прежде чем он решил, что фиксация была щелчком, а не нажатием клавиши возврата.

Я пытался использовать «onCommand» вместо onCommit, но это не сработало, и я не уверен, использовал ли я соответствующий селектор. Я также попытался захватить, когда клавиша ввода нажата на уровне NSWindow. Однако я решил, что это нежелательно, так как я не sh, чтобы это действие выполнялось всякий раз, когда нажимается клавиша ввода.

Любая помощь в связи onCommit с определенной клавишей c (return ) были бы очень признательны.

Я новичок в StackOverflow, поэтому дайте мне знать, если потребуется дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 02 июня 2020
• 1000 . Я не совсем уверен, что именно вызвало его работу.

Если кто-нибудь столкнется с этой проблемой в будущем и наткнется на этот пост, не стесняйтесь обращаться ко мне.

0 голосов
/ 29 мая 2020

Можно реализовать что-то вроде этого. Когда вы нажимаете на синее поле, он отправляет сингл, чтобы сказать, что у вас есть. Поместите рамку за текстовым полем.

Cut'n'Pasted это быстро, кода намного больше, чем вам действительно нужно, вы также можете немного сократить этот ответ.

import SwiftUI
import Combine

let saidNDone = PassthroughSubject<Void, Never>()

struct ContentView: View {
var body: some View {
    Example1()
}
}

struct Example1: View {
@State var viewState: CGSize = .zero
@State var dragState: CGSize = .zero
@State var touched = false

var body: some View {
    let dragGesture = DragGesture(minimumDistance: 0, coordinateSpace: CoordinateSpace.global)
        .onChanged { (value) in
            self.dragState = value.translation
    }.onEnded { (value) in
        self.viewState.width += value.translation.width
        self.viewState.height += value.translation.height
        self.dragState = .zero
        saidNDone.send()
    }
    return VStack {
        Rectangle().foregroundColor(.blue).frame(width: 100, height: 100)
        .offset(x: dragState.width + viewState.width,
                y: dragState.height + viewState.height)
        .gesture(dragGesture)
        Text("Hello World ")
          .onReceive(saidNDone) { ( _ ) in
            self.touched = true
          }
        .foregroundColor(self.touched ? Color.red: Color.black)
    }
}
}

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