2016-12-01 58 views
6

我有超過15個UITextFields的視圖。我必須爲所有UITextFields設置bottomBorder(擴展名)。對於所有UITextFields及其工作,我都可以一個一個地設置。我想立即爲所有UITextFields設置底部邊框。這是我正在嘗試的代碼,但似乎for循環沒有執行。我甚至在viewDidLayoutSubViews中試過,但是在循環中也沒有執行。如何從swift中獲取視圖中的所有文本字段

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    /** setting bottom border of textfield**/ 

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

試試這個'self.view.subviews.filter({$ 0的UITextField})的forEach({$ 0.setBottomBorder()})' –

+0

不能使用它引起我的擴展是「UITextField」類型。我的擴展程序將不可用於查看。 –

回答

6

我做了工作,但仍然需要解釋爲什麼有問題的代碼是n工作
我從論壇上的某個地方得到它,而不是精確地能夠信任答案。

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

試試這個

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

我認爲不需要第一個代碼片段。 –

+0

不工作,控制從if語句跳出 –

0

試試這個:)

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

這對我有效。

var textFieldsArray = [UITextField]() 

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

textFieldsArray.forEach { $0.setBottomBorder() } 

如果您想要在新數組中使用該函數的結果,請改用map()。

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

擴展:

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

這是超級靈活的,非常容易使用! –

6

斯威夫特:該函數將返回所有文本字段中的視圖。無論字段是否存在於任何子視圖中。 ;-)

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

斯威夫特4和斯威夫特3: -
一個很簡單的回答你能理解easyly : - 您可以處理所有類型的像UILable對象,UITextfields,UIButtons,UIView,UIImages。任何種類的objecs等

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 

     } 
    } 
相關問題