gpt4 book ai didi

ios - 模式重新出现时 UILabel 文本未更新

转载 作者:行者123 更新时间:2023-11-28 13:12:23 36 4
gpt4 key购买 nike

我创建了一个可重复使用的模态 UIView 作为单例对象,但在更改它包含的标签文本时遇到了问题。当模式第二次出现时,新文本出现在旧文本之上。我猜这是因为标签只实例化了一次?如果是这样,那为什么我可以添加文本但不能删除它?这是代码:

class TransparentModal: UIView {

static let modal = TransparentModal()

class func modalInView(view: UIView, forSelectionOrPlacement: String) -> TransparentModal {
let f = CGRectMake(0, view.bounds.size.height, view.bounds.size.width, view.bounds.size.height)
modal.frame = f
modal.alpha = 0.7
modal.backgroundColor = UIColor.darkGrayColor()

let button = UIButton(frame: CGRectMake(0, 0, 116, 50))
button.center = CGPointMake(view.bounds.size.width / 2, view.bounds.size.height / 1.6)
button.backgroundColor = UIColor.lightGrayColor()
button.layer.cornerRadius = 4
button.setTitle("Ok", forState: UIControlState.Normal)
button.addTarget(self, action:"dismiss:", forControlEvents: UIControlEvents.TouchUpInside)
modal.addSubview(button)

let label = UILabel(frame: CGRectMake(0, 0, 260, 100))
label.center = CGPointMake(view.bounds.size.width / 2, view.bounds.size.height / 3)
label.numberOfLines = 0
label.text = ""

// This is where I'm going wrong
if forSelectionOrPlacement == "selection" {
label.text = "" // Attempting to remove previous text
label.text = "Text for condition one."
} else if forSelectionOrPlacement == "placement" {
label.text = ""
label.text = "Text for condition two."
}
modal.addSubview(label)
view.addSubview(modal)

self.animateWithDuration(0.5, animations: { () -> Void in
self.modal.frame.origin.y -= view.bounds.size.height
})

return modal
}

class func dismiss(sender: UIButton) {
self.animateWithDuration(0.2, animations: { () -> Void in
self.modal.alpha = 0
}) { (Bool) -> Void in
self.modal.removeFromSuperview()
}
}
}

我知道这是一种创建简单模式的复杂方法。这更像是创建可重用对象的练习。模态还需要出现在其他模态视图、没有导航 Controller 的 View 等之上,所以我想尝试做一些灵活的事情。

更新:除了变量只能作为static 添加到类之外,下面的答案是正确的。在 dismiss 函数中删除标签允许在模态框下次出现时使用新文本重新实例化标签。

最佳答案

正如 kursus 在评论中所写:您不会将按钮和标签作为 subview 从其父 View (实际模态视图)中删除。如果它再次出现,将创建两个新实例并将其放置在之前的实例之上。我猜你只能看到标签,因为它们基本上是透明的,按钮完全覆盖。

要修复它,请在您的类中添加两个变量:

var button:UIButton!
var label:UILabel!

然后将modalInView中的两行改成

if label == nil {
label = UILabel(frame: CGRectMake(0, 0, 260, 100))
}

if button == nil {
button = UIButton(frame: CGRectMake(0, 0, 116, 50))
}

这将导致按钮和标签只有在之前没有被创建的情况下才会被创建。

另一种方法是删除 dismiss 函数的 success block 中的两个 View ,例如

self.animateWithDuration(0.2, animations: { () -> Void in
self.modal.alpha = 0
}) { (Bool) -> Void in
self.modal.removeFromSuperview()
button.removeFromSuperview()
label.removeFromSuperview()
}

关于ios - 模式重新出现时 UILabel 文本未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30832793/

36 4 0
文章推荐: jquery - 页面加载时的垂直 jquery megamenu 插件子菜单
文章推荐: css - 如何为移动设备制作相同的网站布局
文章推荐: blogs - 我的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com