Как получить все текстовые поля из представления в 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
}
}