Как лучше подходить к проверкам UITextField на iOS?

Объединение двух дат не делает многого с точки зрения облегчения запроса базы данных.

Если вы ищете динозавров в отпуск на определенную дату, они могли бы отправиться в отпуск в любое время до эта дата. (Если не существует политики, которая предусматривает максимальное количество дней в отпуске.) Таким образом, конечная дата, вероятно, вы хотите запросить:

{
  "lambeosaurus": {
    "vacationStart" : "2016-12-20",
    "vacationEnd" : "2016-12-25",
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "vacationStart" : "2016-12-10",
    "vacationEnd" : "2016-12-20",
    "length" : 9,
    "weight" : 2500
  }
}

Любые динозавры с vacationEnd вкл. Или после 2016-12-20 будет в отпуске в эту дату, если vacationStart включен или раньше 2016-12-20:

function getHolidayingDinosaurs(day) {
  return firebase.database()
    .ref("dinousaurs")
    .orderByChild("vacationEnd")
    .startAt(day)
    .once("value")
    .then((snapshot) => {
      let holidaying = [];
      snapshot.forEach((child) => {
        let val = child.val();
        if (val.vacationStart <= day) {
          holidaying.push(val);
        }
      });
      return holidaying;
    });
}

getHolidayingDinosaurs("2016-12-20").then((holidaying) => console.log(holidaying));

Не существует прямой альтернативы для дальнейшей фильтрации на клиенте, поскольку вы можете запросить только Firebase с использованием одного свойства, а комбинированные даты не особенно полезны, так как начало и конец могут быть любыми датами до или после даты запроса.

В любом случае, запрос с использованием vacationEnd скорее всего, будет выполнять большую часть фильтрации на сервере - если у вас не будет много динозавров, которые планируют свои отпуска заблаговременно.

Если вышеупомянутый подход приводит к тому, что слишком много информации извлекается и фильтруется на клиенте , вы могли бы приложить дополнительные усилия и могли бы сохранить собственное картографирование отдыхающих динозавров, сохранив некоторые дополнительные данные, структурированные следующим образом:

"holidays": {
  ...
  "2016-12-19": {
    "stegosaurus": true
  },
  "2016-12-20": {
    "lambeosaurus": true,
    "stegosaurus": true
  },
  "2016-12-21": {
    "lambeosaurus": true
  },
  ...
}

Многоуровневая система Firebase (в этом случае [more]] [answer] :

firebase.database().ref().update.({
  "dinosaurs/lambeosaurus": {
    "vacationStart" : "2016-12-20",
    "vacationEnd" : "2016-12-25",
    "length" : 12.5,
    "weight": 5000
  },
  "holidays/2016-12-20/lambeosaurus": true,
  "holidays/2016-12-21/lambeosaurus": true,
  "holidays/2016-12-22/lambeosaurus": true,
  "holidays/2016-12-23/lambeosaurus": true,
  "holidays/2016-12-24/lambeosaurus": true,
  "holidays/2016-12-25/lambeosaurus": true
});

. Запрос на holidays/2016-12-20 был бы затем верните объект с ключами для каждого отдыхающего динозавра.

0
задан LinusGeffarth 27 March 2019 в 07:14
поделиться

3 ответа

Я бы рекомендовал использовать подкласс UITextField с 2 состояниями пользовательского интерфейса (обычный / недействительный) и правилом проверки (например, не пусто / соответствовать регулярному выражению / и т. Д.)

class ValidationTextField: UITextField {

    enum ValidationRule {
        case notEmpty
//      case matchRegex(regex: NSRegularExpression)
//      ...
    }

    var validationRule: ValidationRule?

    private(set) var isValid:Bool = true {
        didSet {
            updateUIForCurrentState()
        }
    }

    // Call this method on the "next" button click 
    // (or from the delegate on the textFieldDidEndEditing event for early validation)
    func validate() {
        guard let rule = validationRule else {
            // nothing to validate
            return;
        }
        switch rule {
        case .notEmpty:
            if let length = text?.count {
                isValid = length > 0
            }
            else {
                isValid = false
            }
        // process other cases (e.g. matchRegex)
        }
    }

    /// Configure your state-specific layout here.
    private func updateUIForCurrentState() {
        // Current implementation adds a red border in case of invalid input
        if isValid {
            layer.borderWidth = 0
            layer.borderColor = nil
        }
        else {
            layer.borderWidth = 2
            layer.borderColor = UIColor.red.cgColor
        }
    }
}
0
ответ дан nrx 27 March 2019 в 07:14
поделиться

Вы можете использовать SwiftValidator , это валидатор на основе правил.

let validator = Validator()

   //Register the fields that you want to validate
    validator.registerField(fullNameTextField, rules: [RequiredRule(), FullNameRule()])


@IBAction func signupTapped(sender: AnyObject) {
    validator.validate(self)
}
0
ответ дан Toseef Khilji 27 March 2019 в 07:14
поделиться

Используйте валидацию для метода UITextFieldDelegate, например, ниже, как:

0
ответ дан kishan suthar 27 March 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: