在 Swift 的 UIView 中查找 UILabel

Posted

技术标签:

【中文标题】在 Swift 的 UIView 中查找 UILabel【英文标题】:Find UILabel in UIView in Swift 【发布时间】:2014-08-20 19:08:44 【问题描述】:

我试图在我的 UIViewControllers 的超级视图中找到我的 UILabel。 这是我的代码:

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)
    

这是在 Objective-C 中推荐的方式,但在 Swift 中,我只得到 UIViews 和 CALayer。我在提供给此方法的视图中肯定有 UILabels。我错过了什么?

我的 UIViewController 中的调用:

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

【问题讨论】:

我用 Xcode 6b6 对此进行了测试,它工作正常:我能够在 UIView 中找到一个 UILabel,它是我的 viewController 视图的子视图。你使用 Xcode 6b6 吗?你使用故事板吗?您何时/如何调用此方法? 感谢您的回复。我使用 Xcode6b5,故事板。该方法放置在一个单独的非 UI 类中,我从 UIViewController 调用它。 watch: 中,当您调用listSubviewsOfView(view) 而不是listSubviewsOfView(self.superview!) 时会得到什么? 我的班级中有一个名为:var superview:UIView? 的变量。我不能称它为“视图”。因此,超级视图是“self.view” 【参考方案1】:

以下版本将在您传入的任何视图中返回所有 UILabel 视图中的 Array

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

然后你可以遍历它们来做任何你想做的事情:

override func viewDidLoad() 
    super.viewDidLoad()

    let labels = getLabelsInView(self.view)
    for label in labels 
        println(label.text)
    

【讨论】:

这很好用.. 谢谢!我会试着找出问题所在 我在 Swift 3.1 中运行它,但它返回两个对象,其中一个是 UIButton 的标签,而不是 UILabel 本身。有没有办法让它更明确? @Alexandros 这里也一样。你找到更好的解决方案了吗? 我正在这样做:for case let label as UILabel in view.subviews ...【参考方案2】:

使用函数式编程概念,您可以更轻松地实现这一目标。

let labels = self.view.subviews.flatMap  $0 as? UILabel 

for label in labels 
//Do something with label

【讨论】:

将此更新为可接受的答案,因为它适用于所有使用 Swift 2.0+ 的代码库。它更干净,(有争议的)更具可读性。斯威夫特已经走了很长一段路:) 我收到Value of type 'UIView' has no member 'flatMap' @Gal 如果您在正确的上下文中编写该代码,它应该可以工作。注释掉这段代码并 cmd+B。你看到任何错误吗?如果没有取消注释并 cmd+B 再次【参考方案3】:

斯威夫特 4

熟悉 mKane 的答案,您可以使用此代码:

let labels = self.view.subviews.compactMap  $0 as? UILabel 

for label in labels 
   // do whatever

【讨论】:

【参考方案4】:

您可以在情节提要中将tag 设置为您的UILabel,或以编程方式使用:

myLabel.tag = 1234 

然后,找到它使用:

let myLabel = view.viewWithTag(1234)

【讨论】:

以上是关于在 Swift 的 UIView 中查找 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 以编程方式在 UIView 中定位项目

在 UIView (Swift) 中绘制圆形切口

如何在标签中打印uiview(swift3)

在 Swift 中的 UIView 上绘制网格

UIButton 未使用 Swift 在 UIView 中显示

如何在 Swift 中使用 SnapKit 使 UIView 具有相等的宽度和高度?