【问题标题】:How to get all the textfields from a view in swift如何快速从视图中获取所有文本字段
【发布时间】:2017-04-15 23:06:50
【问题描述】:

我有一个超过 15 个UITextFields 的视图。我必须为所有UITextFields 设置bottomBorder(extension)。我可以为所有UITextFields 以及它的工作一一设置它。我想一次为所有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()
    }
}

【问题讨论】:

  • 试试这个self.view.subviews.filter({$0 is UITextField}).forEach({$0.setBottomBorder()})
  • 不能使用它,因为我的扩展是“UITextField”类型。我的扩展程序将无法查看。

标签: ios swift textfield


【解决方案1】:

斯威夫特 5
一个非常简单的答案,您可以轻松理解 : - 您可以处理所有类型的对象,如 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
           
     }
 }

【讨论】:

    【解决方案2】:

    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!")}
    

    【讨论】:

      【解决方案3】:

      扩展名:

      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"
      }
      

      【讨论】:

      • 这个超级灵活,非常好用!
      【解决方案4】:
      func getTextFields() {
          for textField in view.subviews where view is UITextField {
             (textField as? UITextField).setBottomBorder()
          }
      }
      

      【讨论】:

      • 又短又甜。
      【解决方案5】:

      这对我有用。

      var textFieldsArray = [UITextField]()
      
      for view in self.view.subviews {
          if view is UITextField {
              textFieldsArray.append(view as! UITextField)
          }
      }
      
      textFieldsArray.forEach { $0.setBottomBorder() }
      

      如果你想在一个新的数组中获取函数的结果,使用 map() 代替。

      【讨论】:

        【解决方案6】:

        我让它工作了,但仍然需要解释为什么有问题的代码不能工作
        我从论坛上的某个地方得到它,不能完全相信答案。

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

        【讨论】:

        • 代码,第 1 部分,在末尾添加“}”。 斯威夫特 5。工作。
        【解决方案7】:

        试试这个:)

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

        【讨论】:

          【解决方案8】:

          试试这个

          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()
          }
          }
          

          【讨论】:

          • 我觉得第一个代码sn -p是没有必要的。
          • 不工作,控制从if语句中跳出来
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-15
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-06
          • 2016-03-03
          相关资源
          最近更新 更多