我们可以删除在 swift 上以编程方式添加的标签吗?
Posted
技术标签:
【中文标题】我们可以删除在 swift 上以编程方式添加的标签吗?【英文标题】:Could we delete a label that have been added programmatically on swift? 【发布时间】:2018-09-07 18:17:42 【问题描述】:我目前在开发我的应用时遇到了困难。为了简单起见,它是一个可以让您进行心算的应用程序。
我的问题是显示已提出的计算、玩家提供的结果以及计算的结果。事实上,当程序知道没有更多的计算可以提议时,它会在包含 for
循环的函数的“案例 2”中启动,如果播放器提供的结果是正确的,该循环将调用 CreatLabelJuste()
函数,如果计算错误,则返回 CreatLabelFAux()
函数。
这些函数创建标签。它工作得很好。问题是要重新启动游戏,我调用 viewDidLoad()
函数来重置我的游戏。但是当必须重新创建标签时,旧标签并没有从包含它们的视图中删除!
我不知道是否足够清楚,但如果有人知道是否有可能“摧毁”这些标签,那么当游戏重新开始时,最终没有任何重叠。
func creatLabelJuste(TagX : Int)
let labelJ = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
let labelForAnswerJ = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
let labelForResultJ = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
switch TagX
case 0 :
labelJ.font = UIFont(name: "futura", size: 20)
labelJ.center = CGPoint(x: 96, y: yAxis)
labelJ.textAlignment = .center
labelJ.text = "\(memoriseCalcule[compter])³"
self.myView.addSubview(labelJ)
labelForAnswerJ.font = UIFont(name: "futura", size: 20)
labelForAnswerJ.center = CGPoint(x: 187, y: yAxis)
labelForAnswerJ.textAlignment = .center
labelForAnswerJ.text = "\(memoriseAnswer[compter])"
self.myView.addSubview(labelForAnswerJ)
labelForResultJ.font = UIFont(name: "futura", size: 20)
labelForResultJ.center = CGPoint(x: 278, y: yAxis)
labelForResultJ.textAlignment = .center
labelForResultJ.text = "\(memoriseResult[compter])"
self.myView.addSubview(labelForResultJ)
// print("/////////////////////////////////////CreateLabelJuste : LabelJ = \(labelJ.text)/ laberForAwnswerJ = \(labelForAnswerJ.text!)/ labelforResultJ+ = \(labelForResultJ.text) ////////////////////////////////////////////")
case 1 :
self.myView.removeFromSuperview()
default :
print("defaut")
func creatLabelFaux(Tag : Int)
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
let labelForAnswer = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
let labelForResult = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
label.text = ""
labelForResult.text = ""
labelForAnswer.text = ""
switch Tag
case 0:
label.font = UIFont(name: "futura", size: 20)
label.center = CGPoint(x: 96, y: yAxis)
label.textAlignment = .center
label.text = "\(memoriseCalcule[compter])³"
label.backgroundColor = UIColor(red: 238/255, green: 105/255, blue: 86/255, alpha: 1)
label.layer.cornerRadius = 10
label.clipsToBounds = true
self.myView.addSubview(label)
labelForAnswer.font = UIFont(name: "futura", size: 20)
labelForAnswer.center = CGPoint(x: 187, y: yAxis)
labelForAnswer.textAlignment = .center
labelForAnswer.backgroundColor = UIColor(red: 238/255, green: 105/255, blue: 86/255, alpha: 1)
labelForAnswer.text = "\(memoriseAnswer[compter])"
self.myView.addSubview(labelForAnswer)
labelForResult.font = UIFont(name: "futura", size: 20)
labelForResult.center = CGPoint(x: 278, y: yAxis)
labelForResult.textAlignment = .center
labelForResult.backgroundColor = UIColor(red: 238/255, green: 105/255, blue: 86/255, alpha: 1)
labelForResult.text = "\(memoriseResult[compter])"
labelForResult.layer.cornerRadius = 10
labelForResult.clipsToBounds = true
self.myView.addSubview(labelForResult)
case 1 :
// label.delete(true)
//labelForAnswer.delete(true)
//labelForResult.delete(true)
self.myView.removeFromSuperview()
default:
print("merde")
for _ in 0..<setLimite
yAxis = yAxis + 30
if memoriseAnswer[compter] == memoriseResult[compter]
creatLabelJuste(TagX: 0)
else //if memoriseAnswer[compter] != memoriseResult[compter]
creatLabelFaux(Tag: 0)
compter = compter + 1
【问题讨论】:
永远不要自己打电话给viewDidLoad
。
您是否尝试将代码从viewDidLoad
移到一个方法中并改为调用该方法? viewDidLoad
将处理您已实现的导航策略(无论是 NavigationController 还是 TabController)并正确执行。
嗨,我在“重播”按钮中调用查看的负载?这不正确吗?我所有的代码都在其他功能上
【参考方案1】:
您需要在类而不是函数中保留对标签的引用。这样你就可以使用了
.removeFromSuperview()
删除标签,就像你在这里做的那样:
self.myView.removeFromSuperview()
类似这样的:
var labelJ: UILabel!
var labelForAnswerJ: UILabel!
var labelForResultJ: UILabel!
func creatLabelJuste(TagX : Int)
labelJ = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
labelForAnswerJ = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
labelForResultJ = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
...
...
...
另外,如果您手动调用viewDidLoad()
- 这不是一个好方法
只需在您的游戏重启逻辑中添加一些新功能并从viewDidLoad()
调用它
当你需要重启游戏时只需调用这个函数而不是viewDidLoad()
还为每个需要删除的标签添加label.removeFromSuperview()
并在需要重启游戏时拨打restart()
把你的代码改成这个,替换myView
初始化
还要更改viewDidLoad()
和Replay()
。添加reset()
函数
var myView: UIView!
override func viewDidLoad()
super.viewDidLoad()
reset()
func reset()
myView = UIView(frame: (CGRect(x: 0, y: 200, width: 375, height: 400)))
self.enterTextField.becomeFirstResponder()
// is Hidden ppt
ReplayBtn.isHidden = true
goBackBtn.isHidden = true
enterTextField.isHidden = false
nextBtn.isHidden = false
// set variables to 0
numberToCube = 0
result = 0
resultFromUser = ""
lenghtAnswer = 0
stats = 0
score = 0
limite = 0
scoreLbl.text = ""
displayNumberLbl.text = ""
displayResultLbl.text = ""
displayAnswerLbl.text = ""
memoriseCalcule.removeAll()
memoriseAnswer.removeAll()
memoriseResult.removeAll()
ListeNombre = "Asked :\n"
ListeAnswer = "Answer :\n"
ListeCanswer = "Correct :\n"
yAxis = 50
compter = 0
// Label Manager
scoreLbl.textColor = UIColor.black
NumberLbl.textColor = UIColor.black
scoreLbl.textAlignment = NSTextAlignment.center
self.NumberLbl.frame = CGRect(x: 26, y: 100, width: 322, height: (50))
self.scoreLbl.frame = CGRect(x: 26, y: 180, width: 322, height: (50))
NumberLbl.textColor = UIColor.white
// Launch func
number()
@IBAction func Replay(_ sender: Any)
LabelJ.removeFromSuperview()
labelForAnswerJ.removeFromSuperview()
labelForResultJ.removeFromSuperview()
reset()
creatLabelFaux(Tag: 1)
creatLabelJuste(TagX: 1)
【讨论】:
好的,我明白了,看起来很合乎逻辑,我会试试这个,我会告诉你的!但还是谢谢你的回答! ;) 嗨,我试图在类中声明标签,但问题仍然存在:当我第二次完成游戏时,标签重叠..通过将它们从视图中删除它们就消失了,但是他们不“清楚” @HenriPiot 实际上你可以在重启时做任何你想做的事情——也可以清除标签。 (更改文本、颜色等)。或者在重新启动时重新创建它们(设置默认值~清除它们) 你在清除myView
吗?这应该是非常简单的逻辑问题。只需检查您如何重新创建视图层次结构。检查此视频。它可能会帮助您进行可视化调试。 developer.apple.com/videos/play/wwdc2016/410
我希望它们被清除,您会在我发布的 3D 图片中轻松看到这一点!以上是关于我们可以删除在 swift 上以编程方式添加的标签吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 SWIFT OS X 中以编程方式添加和删除 NSTextField
如何在swift上以编程方式更改uisegmentedcontrol的字体大小和字体名称?