【问题标题】:unable to find view with tag无法找到带有标签的视图
【发布时间】:2017-12-22 20:15:03
【问题描述】:

在我的 viewWillAppear() 中,我创建了一个标签并给它一个标签。当满足另一个条件时,我尝试删除标签,但由于某种原因,它不起作用并且标签仍在视图中。我一定是做错了什么……

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    var label: UILabel?

    // Add label if there are no recipes
    if (recipeBook.recipesArr.count == 0) {

        label = self.view.viewWithTag(123) as? UILabel
        //label?.tag = 123 // arbitrary num

        label = UILabel(frame: CGRect(x: 0, y: self.view.frame.height/3, width: self.view.frame.width, height: 100))
        label?.text = "Add A Recipe"
        label?.textColor = UIColor(red:0.93, green:0.92, blue:0.92, alpha:1.0)
        label?.font = label?.font.withSize(36)
        label?.textAlignment = .center

        self.view.addSubview(label!)
    }

    else {

        // remove it
        if let foundLabel = self.view.viewWithTag(123) {
            foundLabel.removeFromSuperview()
        } else {
            print("Couldn't find label with tag in view")
        }

    }

}

我没有意识到在label = UILabel(frame: CGRect(x: 0, y: self.view.frame.height/3, width: self.view.frame.width, height: 100)) 这一行中,我正在创建一个默认标记为 0 的新标签。将其更改为 label?.frame = CGRect(x: 0, y: self.view.frame.height/3, width: self.view.frame.width, height: 100),这样我就不会创建新标签并且一切正常。愚蠢的错误。

【问题讨论】:

  • 您在viewWillAppear 中按标签获取标签,在下一行中,您使用默认标签0 的新UILabel 实例覆盖它。您期望什么?

标签: swift viewwillappear viewwithtag


【解决方案1】:

您的代码没有按照您的想法执行。如果您的 recipesArr 为空(或更准确地说计数为零),您正在尝试查找带有标签 123 的标签/视图。然后将其忽略并创建一个新标签但不给它一个标签。

你需要做的是在你创建标签之后分配你创建标签 123 的标签,如下所示:

label?.tag = 123

然后您将创建标签并设置它的标签,以便随后可以找到它。

【讨论】:

  • 啊,谢谢。我的菜鸟没有意识到我用 UILabel(frame: CGRect(...)) 创建标签的方式会创建一个新标签。
【解决方案2】:

您正在label = UILabel(frame: CGRect 行之后重新创建标签

您可以像这样以编程方式创建标签,无需选项:

lazy var recipeLabel: UILabel = {
    let label = UILabel(frame: CGRect(x: 0, y: self.view.frame.height/3, width: self.view.frame.width, height: 100))
    label.tag = 123
    label.text = "Add A Recipe"
    label.font = UIFont.systemFont(ofSize: 17.0)
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

然后使用 iOS 9+ constraints if needed 将其添加到您的子视图中:

 self.view.addSubview(recipeLabel)

然后,您可以通过简单地引用视图 recipeLabel.tag 属性(如果需要)来访问任何位置的视图。

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多