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!


¿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!")
    }
}

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

¡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()

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

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.