ForEach через несколько TextField, чтобы проверить, пусто ли оно или нет в SwiftUI

У меня небольшие проблемы с выяснением, как я могу проверить, пуст ли текст в каждом из моих текстовых полей. У меня есть 3 раздела текстовых полей в VStack, мне нужен только ввод пользователя из 2/3 разделов (переменных, я думаю), которые вы видите ниже.

Как я могу проверить, в каких двух разделах текст, введенный пользователем, и получить окончательные результаты в разделе, в котором текстовые поля остались пустыми? Я уже поместил все свои переменные TextField String в ленивую переменную.

Теперь я знаю, что для этого мне нужно forEach, или даже For In было бы более предпочтительным.

Заранее спасибо!

Надеюсь, я хорошо объяснил это и вижу, что это возможно в будущем для других, например, затенение текстового поля, которое осталось пустым из 2/3 разделов. Это всего лишь один пример, но ценю его!


person Dewan    schedule 31.01.2020    source источник
comment
что ты уже испробовал?   -  person fulvio    schedule 31.01.2020
comment
@fuzz Я поместил все свои текстовые поля в массив, тогда это let theArr = self.array.allSatisfy {$ 0.isEmpty}, но я не могу его использовать по какой-то причине. Я получаю изменяемую ошибку   -  person Dewan    schedule 31.01.2020


Ответы (1)


Вы можете выполнить обновление на основании следующего:

 @State var array = [String](repeating: "", count: 3)
 @State var array1 = [String](repeating: "", count: 1)
 @State var array2 = [String](repeating: "", count: 3)
 @State  var var1 = true
 @State  var var2 = true
 @State  var var3 = true


  var body: some View{
  VStack {
    HStack{ TextField("text0", text: $array[0])
            TextField("text0", text: $array[1])
            TextField("text0", text: $array[2])
    }.onReceive(array.publisher) { _ in

        self.var1 = self.array.allSatisfy{$0.isEmpty}
        self.check()
      }
    HStack{
       TextField("text1", text: $array1[0])
    }.onReceive(array1.publisher) { _ in

        self.var2 = self.array1.allSatisfy{$0.isEmpty}
        self.check()
      }
    HStack{
      TextField("text2", text: $array2[0])
      TextField("text2", text: $array2[1])
       TextField("text2", text: $array2[2])
    }.onReceive(array2.publisher) { _ in

        self.var3 = self.array2.allSatisfy{$0.isEmpty}
        self.check()
      }
   }
  }

 func check(){

    switch ( (var1 ? 1 : 0) | (var2 ? 2: 0) | (var3 ? 4:0)){
        case 0b001: print( "var1", var1)
        case 0b010: print( "var2", var2)
        case 0b100: print( "var3", var3)
        default: return
        }
    }

   }
person E.Coms    schedule 31.01.2020
comment
Как это сказать мне, какое поле пусто? У меня будет кнопка, которая будет проверять. Я просто хочу, чтобы пользователь заполнил любые 2 раздела из 3-х и получил результаты после того, как математика отобразилась в поле, которое пользователь оставил пустым, на основе информации о первых 2-х разделах. - person Dewan; 01.02.2020
comment
Любая идея? Я не совсем уверен в этом. Мне, возможно, придется сделать это по-другому - person Dewan; 04.02.2020
comment
Вы можете добавить функцию check, чтобы узнать, какая из них пуста. - person E.Coms; 05.02.2020
comment
Я попытался выполнить оператор if, чтобы проверить все предоставленные переменные, но не сработал. Мне кажется, я над этим слишком много думаю, это самое сложное из всего моего приложения и последнее. На самом деле пытаюсь довести это до ума. Спасибо! - person Dewan; 06.02.2020
comment
Я добавил вам чек - person E.Coms; 06.02.2020
comment
Просто из любопытства и желая понять, я получил большую часть кода, но что означает (var1? 1: 0)? Я знаю | означает сравнивать друг с другом - person Dewan; 12.02.2020
comment
Всего лишь один способ преобразовать Bool в Integer. - person E.Coms; 12.02.2020
comment
Как я могу сбросить все результаты массива для повторного использования? Прямо сейчас открываю и закрываю вид. У меня есть кнопка, которая вызывает self.check () - person Dewan; 26.02.2020
comment
Просто сбросьте все значения массива и все вары - person E.Coms; 26.02.2020
comment
Я сделал self.array.removeAll (), но он не очистил текстовые поля. Мне тоже нужно что-то делать с варами? Пример? Спасибо, чувак, ты был хорошим парнем через все это. - person Dewan; 26.02.2020
comment
Установите для них начальные значения в верхней части кодов. - person E.Coms; 26.02.2020
comment
Исходные значения будут равны 0, пока пользователь не нажмет кнопку, а затем перейдет к приведенному выше случаю, который вы мне показали. Я не уверен, что вы имеете в виду, тогда не удалял бы всю работу, потому что так было изначально, когда вы открываете страницу. Я не совсем понимаю - person Dewan; 27.02.2020
comment
Для каждого массива установите его исходное значение, которое не является пустым массивом. например: array = [String] (повторение:, count: 3) - person E.Coms; 27.02.2020