web-dev-qa-db-ja.com

swiftのビューからすべてのテキストフィールドを取得する方法

15 UITextFieldsを超えるビューがあります。すべてのUITextFieldsにbottomBorder(extension)を設定する必要があります。すべてのUITextFieldsとその動作に対して1つずつ設定できます。すべてのUITextFieldsの下枠を一度に設定したいと思います。これが私が試しているコードですが、forループが実行されていないようです。 viewDidLayoutSubViewsでも試しましたが、forループも実行されていません。

 override func viewDidLoad() 
{
    super.viewDidLoad()

    /** setting bottom border of textfield**/

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

私はそれを機能させましたが、それでも説明が必要です問題のコードが機能しない理由
フォーラムのどこかから入手しましたが、正確に答えを信用することはできません。

/** 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()
    }
}
9
Kunal Kumar

Swift:この関数は、ビュー内のすべてのテキストフィールドを返します。フィールドがサブビューに存在するかどうかは関係ありません。 ;-)

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({$0})
}

使用法:

_=getAllTextFields(fromView : self.view).map{($0.text = "Hey dude!")}
14
Gurjit Singh

これを試して

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()
}
}
2
Anbu.Karthik

拡張:

extension UIView {
    func viewOfType<T:UIView>(type:T.Type, process: (_ view:T) -> Void)
    {        
        if let view = self as? T
        {
            process(view)
        }
        else {
            for subView in subviews
            {
                subView.viewOfType(type:type, process:process)
            }
        }
    }
}

使用法:

view.viewOfType(type:UITextField.self) {
        view in

        view.text = "123"
}
2
Chen Jiling

これは私のために働いた。

var textFieldsArray = [UITextField]()

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

textFieldsArray.forEach { $0.setBottomBorder() }

新しい配列に適用された関数の結果を取得する場合は、代わりにmap()を使用してください。

1
GBaeOne

これを試して :)

for view in self.view.subviews as! [UIView] {
    if let textField = view as? UITextField {
        textField.setBottomBorder()
    }
}
1
Kevin Sabbe
func getTextFields() {
    for textField in view.subviews where view is UITextField {
       (textField as? UITextField).setBottomBorder()
    }
}
1
Jamal alayq

Swift4およびSwift 3:-
簡単に理解できる非常に単純な答え:-UILable、UITextfields、UIButtons、UIView、UIImagesなどのあらゆる種類のオブジェクトを処理できます。あらゆる種類のオブジェクトなど。

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

        }
    }
0
Shakeel Ahmed