SwiftUI 防止用户在输入数据时点击按钮

SwiftUI Prevent user from tapping button while entering data

如果用户在 DataPtView 中编辑 TextField(光标闪烁)时单击按钮,应用程序会崩溃。

在列表单元格中,我有一个按钮,它会影响同样显示在单元格中的视图。 这是一个片段,iPad 具体。

单元格视图:

VStack{
  Button("TagOut"){
    self.tagOut.toggle()
  }
  
  if self.tagOut {
    TagOutView(question: question)
  }
  
  if !self.tagOut{
    if question.type == "Y/N"{
      YesOrNoView(question: question)
    } else if question.type == "DataPt"{
      DataPtView(question: question)
    } else {
      RecordEntryView()
  }
  ...

数据点视图:

...
TextField("Data: ", text: $collectedData)
       .onReceive(Just(collectedData)) {value in
         let filtered = value.filter {"01234567890-".contains([=11=])}
         if filtered != value{
           self.invalidCollectedData = true
         } else {
           self.invalidCollectedData = false
         }
 }
 ...

当 CellView 被键盘覆盖时,我还使用了 AdaptsToKeyboard ViewModifier。 move-textfield-up-when-the-keyboard-has-appeared-in-swiftu

如何防止这种情况发生?如果用户在单击按钮之前隐藏键盘,一切都很好,但这并不直观。

如果您尝试检查修饰符高度是否大于 0 并基于此句柄单击按钮会怎么样。在您的单元格视图中定义:

@State var keyboardHeight: CGFloat = 0

将您的 AdaptsToKeyboardModifier 更改为在其中绑定 var

struct AdaptsToKeyboard: ViewModifier {
    @Binding var currentHeight: CGFloat = 0
    ...
}

现在您需要使用以下构造函数初始化修饰符:

.modifier(AdaptsToKeyboard(currentHeight: $keyboardHeight))

现在您有两个选项来处理按钮按下:

  1. 要禁用按钮交互:

      Button("TagOut"){
        self.tagOut.toggle()
      }.disabled(keyboardHeight > 0)
    
  2. 忽略新闻:

       Button("TagOut") {
         if self.keyboardHeight == 0 {
            self.tagOut.toggle()
         }
       }