Find UILabel in UIView in Swift

I’m trying to find my UILabels in my superview of my UIViewControllers.
This is my code:

func watch(startTime:String, endTime:String) {
    if superview == nil {println("NightWatcher: No viewcontroller specified");return}

    listSubviewsOfView(self.superview!)

}

func listSubviewsOfView(view: UIView) {
    var subviews = view.subviews

    if (subviews.count == 0) { return }

    view.backgroundColor = UIColor.blackColor()

    for subview in subviews {
        if subview.isKindOfClass(UILabel) {
            // do something with label..
        }
        self.listSubviewsOfView(subview as UIView)
    }
}

This is how it is recommended to in Objective-C, but in Swift I get nothing but UIViews and CALayer. I definitely have UILabels in the view that is supplied to this method. What am I missing?

  • Facebook iOS SDK not returning to my app
  • “Expression are not allowed at top level” in function call of a class in Swift
  • Swift TableView in a UIView not displaying data
  • pathForResource returns nil in Mac OS X Console Application — Swift
  • iOS change navigation bar title font and color
  • iPhone indoor location based app
  • The call in my UIViewController:

      NightWatcher(view: self.view).watch("21:00", endTime: "08:30") // still working on
    

    2 Solutions Collect From Internet About “Find UILabel in UIView in Swift”

    Using functional programming concepts you can achieve this much easier.

    let labels = self.view.subviews.flatMap { $0 as? UILabel }
    
    for label in labels {
    //Do something with label
    }
    

    Here’s a version that will return an Array of all the UILabel views in whatever view you pass in:

    func getLabelsInView(view: UIView) -> [UILabel] {
        var results = [UILabel]()
        for subview in view.subviews as [UIView] {
            if let labelView = subview as? UILabel {
                results += [labelView]
            } else {
                results += getLabelsInView(view: subview)
            }
        }
        return results
    }
    

    Then you can iterate over them to do whatever you’d like:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let labels = getLabelsInView(self.view)
        for label in labels {
            println(label.text)
        }
    }