SwiftUI Запретить пользователю нажимать кнопку при вводе данных - PullRequest
2 голосов
/ 14 июля 2020

Если пользователь нажимает кнопку во время редактирования TextField (курсор мигает) в DataPtView, приложение вылетает.

В ячейке списка у меня есть кнопка, которая влияет на представление, которое также отображается в ячейка. Вот фрагмент, специально для iPad c.

CellView:

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()
  }
  ...

DataPtView:

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

Я также использую AdaptsToKeyboard ViewModifier, когда CellView является накрыта клавиатурой. move-textfield-up-when-the-keyboard-has-been-in-swiftu

Как мне предотвратить это? Если пользователь прячет клавиатуру перед нажатием кнопки, все в порядке, но это не интуитивно понятно.

1 Ответ

1 голос
/ 14 июля 2020

Что, если вы попытаетесь проверить, больше ли высота вашего модификатора 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()
         }
       }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...