Быстро, как сделать так, чтобы предыдущая метка исчезла, а новая появилась

#swift #swift-playground

Вопрос:

Я создаю свой первый проект, который представляет собой игру «Правда или вызов», но когда я нажимаю кнопку, чтобы напечатать «Правда/вызов», этикетки накладываются друг на друга. Как мне сделать так, чтобы предыдущий ярлык исчез, а новый остался один. Заранее спасибо

 

import UIKit
import PlaygroundSupport

public class ViewController: UIViewController {
    public override func loadView() {
        //adding baground
        super.loadView()
        let view = UIView()
        view.backgroundColor = .red
        self.view = view
        //dare button
        let dareButton = UIButton(frame: CGRect(x:300, y: 500, width: 100, height: 69))
        dareButton.layer.cornerRadius = 10
        dareButton.backgroundColor = #colorLiteral(red: 0.6352941393852234, green: 0.6470588445663452, blue: 0.886274516582489, alpha: 1.0)
        dareButton.setTitle("dare", for: UIControl.State.normal)
        dareButton.isUserInteractionEnabled = true
        dareButton.addTarget(self, action: #selector(dareButtonDidTap), for: .touchDown)
        view.addSubview(dareButton)
        self.view = view
        view.addSubview(dareButton)
    }
    @objc
    private func dareButtonDidTap() {
        let lbl = UILabel(frame: CGRect(x:95 , y:100, width: 325, height: 500))
        lbl.text = daresEng.randomElement()
        lbl.textColor = #colorLiteral(red: 0.6313725709915161, green: 0.6470588445663452, blue: 0.9058823585510254, alpha: 1.0)
        lbl.numberOfLines = 6
        view.addSubview(lbl)
    }
}

PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = ViewController()

 

Ответ №1:

Метки складываются , потому что вы создаете новую метку и добавляете ее в представление каждый раз, когда нажимаете на dareButton нее, а предыдущие метки не удаляются из superView нее . Таким образом, вы можете переместить метку на уровень класса и добавить ее в представление loadView() . Таким образом, у вас есть только одна метка , и в dareButtonDidTap() ней вам нужно только изменить текст этой метки.

 import UIKit
import PlaygroundSupport

public class ViewController: UIViewController {
    let lbl = UILabel(frame: CGRect(x:95 , y:100, width: 325, height: 500))
    
    public override func loadView() {
        //adding baground
        super.loadView()
        let view = UIView()
        view.backgroundColor = .red
        self.view = view
        //dare button
        let dareButton = UIButton(frame: CGRect(x:300, y: 500, width: 100, height: 69))
        dareButton.layer.cornerRadius = 10
        dareButton.backgroundColor = #colorLiteral(red: 0.6352941393852234, green: 0.6470588445663452, blue: 0.886274516582489, alpha: 1.0)
        dareButton.setTitle("dare", for: UIControl.State.normal)
        dareButton.isUserInteractionEnabled = true
        dareButton.addTarget(self, action: #selector(dareButtonDidTap), for: .touchDown)
        view.addSubview(dareButton)
        self.view = view
        
        view.addSubview(lbl)
        view.addSubview(dareButton)
    }
    
    @objc
    private func dareButtonDidTap() {
        lbl.text = daresEng.randomElement()
        lbl.textColor = #colorLiteral(red: 0.6313725709915161, green: 0.6470588445663452, blue: 0.9058823585510254, alpha: 1.0)
        lbl.numberOfLines = 6

    }
}

PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = ViewController()