Подтвердить что ты не робот

Прокрутите через subview, чтобы проверить наличие пустого UITextField - Swift

Я задаюсь вопросом, как существенно преобразовать объективный код c ниже в swift.

Это будет проходить через все дочерние объекты на моем желаемом представлении, проверьте, являются ли они текстовыми полями, а затем проверьте, не являются ли они пустыми.

for (UIView *view in contentVw.subviews) {
    NSLog(@"%@", view);
    if ([view isKindOfClass:[UITextField class]]) {
        UITextField *textfield = (UITextField *)view;
        if (([textfield.text isEqualToString:""])) {
            //show error
            return;
        }
    }
}

Вот где я с быстрым переводом:

for view in self.view.subviews as [UIView] {
    if view.isKindOfClass(UITextField) {
        //...

    }
}

Любая помощь будет замечательной!

4b9b3361

Ответ 1

Swift 5 и Swift 4: - Очень простой ответ, который вы можете легко понять: - Вы можете обрабатывать все виды объектов, такие как UILable, UITextfields, UIButtons, UIView, UIImages. любой вид предметов и т.д.

for subview in self.view.subviews
{
    if subview is UITextField
    {
        //MARK: - if the sub view is UITextField you can handle here
        if subview.text == ""
        {
            //MARK:- Handle your code
        }
    }
    if subview is UIImageView
    {
     //MARK: - check image
      if subview.image == nil
      {
             //Show or use your code here
      }

    }
}

//MARK:- You can use it any where, where you need it
//Suppose i need it in didload function we can use it and work it what do you need

override func viewDidLoad() {
    super.viewDidLoad()
    for subview in self.view.subviews
    {
        if subview is UITextField
        {
         //MARK: - if the sub view is UITextField you can handle here
            if subview.text == ""
            {
               //MARK:- Handle your code
            }
        }
        if subview is UIImageView
        {
          //MARK: - check image
            if subview.image == nil
                {
                 //Show or use your code here
                }
            }
        }
    }

Ответ 2

Обновление для Swift 2 (и более поздних версий): С Swift 2/Xcode 7 это можно упростить.

  • В связи с Objective-C "легкими генериками" self.view.subviews уже объявлен как [UIView] в Swift, поэтому приведение больше не требуется.
  • Перечисление и необязательный литье могут быть объединены с циклом for-loop с шаблоном case.

Это дает:

for case let textField as UITextField in self.view.subviews {
    if textField.text == "" {
        // show error
        return
    }
}

Старый ответ для Swift 1.2:

В Swift это красиво сделано с помощью опционального оператора downt as?:

for view in self.view.subviews as! [UIView] {
    if let textField = view as? UITextField {
        if textField.text == "" {
            // show error
            return
        }
    }
}

См. "Downcasting" в книге Свифта.