gpt4 book ai didi

ios - 我们可以删除在 swift 上以编程方式添加的标签吗?

转载 作者:行者123 更新时间:2023-11-28 07:41:04 24 4
gpt4 key购买 nike

我目前在开发我的应用程序时遇到困难。为简单起见,它是一个允许您进行心算的应用程序。

我的问题是显示已经提出的计算,玩家提供的结果,以及计算的结果。事实上,当程序知道没有更多计算建议时,它会在包含调用 CreatLabelJuste()for 循环的函数的“案例 2”中启动> 如果播放器提供的结果正确则执行函数,如果计算错误则执行 CreatLabelFAux() 函数。

这些函数创建标签。它工作得很好。问题是要重新启动游戏,我调用了 viewDidLoad() 函数来重置我的游戏。但是,当必须重新创建标签时,旧标签并没有从包含它们的 View 中删除!

不知道说的够不够清楚,但如果有人知道是否可以“破坏”这些标签,那么当游戏再次开始时,最后没有任何重叠。

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
}

最佳答案

您需要在类而不是函数中保留对标签的引用。所以你将能够使用

.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)
}

关于ios - 我们可以删除在 swift 上以编程方式添加的标签吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52227785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com