【问题标题】:Could we delete a label that have been added programmatically on swift?我们可以删除在 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)并正确执行。
  • 嗨,我在“重播”按钮中调用查看的负载?这不正确吗?我所有的代码都在其他功能上

标签: ios swift uilabel programmatically-created


【解决方案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 图片中轻松看到这一点!
猜你喜欢
  • 2017-04-17
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多