Swift agrega subview y elimínela

81

Quiero agregar una vista secundaria y eliminarla con un toque. Este es mi codigo:

/ * Para agregar subvista * /

var testView: UIView = UIView(frame: CGRectMake(0, 0, 320, 568))
testView.backgroundColor = UIColor.blueColor()
testView.alpha = 0.5
testView.tag = 100
super.view.userInteractionEnabled = false
self.view.userInteractionEnabled = true
self.view.addSubview(testView)

/ * Para eliminar subvista * /

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    let touch = touches.anyObject() as UITouch
    let point = touch.locationInView(self.view)

    if(testView.tag==100){
        println("Tag 100")
        testView.removeFromSuperview()
    }
    else{
        println("tag not found")
    }

}

Pero eliminarlo no funciona. ¿Alguien puede ayudarme, por favor? ¡Gracias!

Dasoga
fuente
¿Qué significa "no funciona"? ¿La adición? ¿La eliminación? Errores? Edite su pregunta para incluir más información.
ABMagil
1
testView es la vista con etiqueta 100, no self.view, por lo que su declaración if nunca se ejecuta.
rdelmar
Gracias por responder. Está editado ahora
Dasoga

Respuestas:

99

Gracias por la ayuda. Esta es la solución: creé la subvista y agrego un gesto para eliminarla

@IBAction func infoView(sender: UIButton) {
    var testView: UIView = UIView(frame: CGRectMake(0, 0, 320, 568))
    testView.backgroundColor = UIColor.blueColor()
    testView.alpha = 0.5
    testView.tag = 100
    testView.userInteractionEnabled = true
    self.view.addSubview(testView)

    let aSelector : Selector = "removeSubview"
    let tapGesture = UITapGestureRecognizer(target:self, action: aSelector)
    testView.addGestureRecognizer(tapGesture)
}

func removeSubview(){
    println("Start remove sibview")
    if let viewWithTag = self.view.viewWithTag(100) {
        viewWithTag.removeFromSuperview()
    }else{
        println("No!")
    }
}

Actualizar:

Swift 3+

@IBAction func infoView(sender: UIButton) {
    let testView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 568))
    testView.backgroundColor = .blue
    testView.alpha = 0.5
    testView.tag = 100
    testView.isUserInteractionEnabled = true
    self.view.addSubview(testView)

    let aSelector : Selector = #selector(GasMapViewController.removeSubview)
    let tapGesture = UITapGestureRecognizer(target:self, action: aSelector)
    testView.addGestureRecognizer(tapGesture)
}

func removeSubview(){
    print("Start remove sibview")
    if let viewWithTag = self.view.viewWithTag(100) {
        viewWithTag.removeFromSuperview()
    }else{
        print("No!")
    }
}
Dasoga
fuente
73

Tienes que usar la viewWithTagfunción para encontrar la vista con el dado tag.

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    let touch = touches.anyObject() as UITouch
    let point = touch.locationInView(self.view)

    if let viewWithTag = self.view.viewWithTag(100) {
        print("Tag 100")
        viewWithTag.removeFromSuperview()
    } else {
        print("tag not found")
    }
}
rakeshbs
fuente
¡Gracias! en realidad esto resolvió mi problema. Pero la interacción con la super view no la desactiva. ¿Cómo puedo desactivar la interacción con la supervista?
Dasoga
No entendí. ¿Qué interacción con la supervista?
rakeshbs
Tengo un gesto de toque en la primera vista, luego con un botón agrego una subvista, pero es solo una vista de información, por lo que con un toque quiero eliminarla. Ahora está funcionando el grifo de extracción. Pero en la primera vista recibo el mismo grifo, necesito desactivar ese grifo ... ¡¡Gracias !!
Dasoga
¿Dónde desea tocar para eliminar la vista de información? ¿Desea eliminar la vista cuando la vista de información se toca en el interior y no en el exterior?
rakeshbs
Sí, cuando el usuario toca la vista de información (segunda vista), quiero eliminar esa vista (segunda vista) y mostrar la primera vista nuevamente.
Dasoga
2

Suponiendo que tenga acceso a él a través de puntos de venta o código programático, puede eliminarlo haciendo referencia a su vista fooy al removeFromSuperviewmétodo

foo.removeFromSuperview()
arte
fuente
0

Tengo una vista dentro de mi CollectionViewCell personalizada e incrustando un gráfico en esa vista. Para actualizarlo, tengo que verificar si ya hay un gráfico colocado en esa vista, eliminarlo y luego aplicar uno nuevo. Esta es la solucion

cell.cellView.addSubview(graph)
graph.tag = 10

ahora, en el bloque de código donde desea eliminarlo (en su caso, gestoRecognizerFunction)

if let removable = cell.cellView.viewWithTag(10){
   removable.removeFromSuperview()
}

para incrustarlo de nuevo

cell.cellView.addSubview(graph)
graph.tag = 10
Muhammad Hamza Munir
fuente
-9

Probé este código usando XCode 8 y Swift 3

Para agregar una vista personalizada a SuperView, use:

self.view.addSubview(myView)

Para quitar la vista personalizada de Superview use:

self.view.willRemoveSubview(myView)

Pravin Kamble
fuente
8
willRemoveSubview no elimina la subvista de la supervista. Solo indica cuándo se va a eliminar la subvista.
Murat Yasar
3
Para eliminar la vista personalizada de la supervista, se debe usar myView.removeFromSuperview ()
Yaroslav Bai
1
willRemoveSubview no elimina la subvista de la supervista.
Imtee el