Как получить все текстовые поля из представления в Swift

у меня есть вид, который имеет более 15 UITextFields. Я должен установить bottomBorder(расширение) для всех UITextFields. Я могу установить его один за всех UITextFields и его работа тоже. Я хочу установить нижнюю границу для всех UITextFields сразу. Вот код, который я пытаюсь, но кажется, что цикл for не выполняется. Я даже пробовал это в viewDidLayoutSubViews но цикл не выполняется там.

 override func viewDidLoad() 
{
    super.viewDidLoad()

    /** setting bottom border of textfield**/

    for case let textField as UITextField in self.view.subviews {
        textField.setBottomBorder()
    }
}

8 ответов


Свифт: эта функция возвращает все текстовые поля в представлении. Независимо от того, существует ли поле в любом подвиде. ;-)

func getAllTextFields(fromView view: UIView)-> [UITextField] {
    return view.subviews.flatMap { (view) -> [UITextField]? in
        if view is UITextField {
            return [(view as! UITextField)]
        } else {
            return getAllTextFields(fromView: view)
        }
    }.flatMap({})
}

использование:

_=getAllTextFields(fromView : self.view).map{(.text = "Hey dude!")}

Я сделал это работает, но все еще нужно объяснение почему код, о котором идет речь, не работает
Я получил его откуда-то на форуме, не совсем в состоянии поверить ответу.

/** extract all the textfield from view **/
func getTextfield(view: UIView) -> [UITextField] {
var results = [UITextField]()
for subview in view.subviews as [UIView] {
    if let textField = subview as? UITextField {
        results += [textField]
    } else {
        results += getTextfield(view: subview)
    }
}
return results  

вызовите вышеуказанную функцию в viewDidLoad или viewDidLayoutSubviews.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

/** setting bottom border to the textfield **/
    let allTextField = getTextfield(view: self.view)
    for txtField in allTextField
    {
        txtField.setBottomBorder()
    }
}

попробуй такое

for aSubView: Any in self.view.subviews {
if (aSubView is UITextField) {
    var textField = (aSubView as! UITextField)
    textField. setBottomBorder()
}
}     

или попробуйте это

for view in self.view.subviews {
if (view is UITextField) {
     var textField = view as! UITextField
      textField. setBottomBorder()
}
}

это сработало для меня.

var textFieldsArray = [UITextField]()

for view in self.view.subviews {
    if view is UITextField {
        textFieldsArray.append(view as! UITextField)
    }
}

textFieldsArray.forEach { .setBottomBorder() }

Если вы хотите получить результат функции, примененной в новом массиве, вместо этого используйте map ().


func getTextFields() {
    for textField in view.subviews where view is UITextField {
       (textField as? UITextField).setBottomBorder()
    }
}

попробуйте это :)

for view in self.view.subviews as! [UIView] {
    if let textField = view as? UITextField {
        textField.setBottomBorder()
    }
}

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

for subviews in self.view.subviews
    {
        if subviews is UITextField
        {
            //MARK: - if the sub view is UITextField you can handle here
            funtextfieldsetting(textfield: subviews as! UITextField)
        }
        if subviews is UIButton
        {
         //MARK: - if the sub view is UIButton you can handle here
           funbuttonsetting(button: subviews as! UIButton)
        }
        if subviews is UILabel
        {
         //MARK: - if the sub view is UILabel you can handle here
         //Any thing you can do it with label or textfield etc

        }
    }