Можем ли мы удалить ярлык, который был добавлен программно в Swift? - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я испытываю трудности при разработке моего приложения. Чтобы сделать это проще, это приложение, которое позволяет вам делать умственные вычисления.

Моя проблема связана с отображением предложенных расчетов, результатов, предоставленных игроком, и результатов расчета. Фактически, когда программа знает, что больше нет расчета для предложения, она запускает «случай 2» функции, которая содержит цикл for, который вызывает функцию 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
}

1 Ответ

0 голосов
/ 07 сентября 2018

Вам нужно сохранить ссылку на метку в классе вместо функции. Таким образом, вы сможете использовать

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