2016-07-25 30 views
0

entfernen Ich habe folgenden Code, um UIView und UIButton als Tags innerhalb UIScrollView hinzufügen. Alles funktioniert gut, um Daten an UIScrollView anzuhängen. Problem ist, wie UIView & UIButton in UIScrollView entfernt wird. Ich habe es entfernt, aber es verschwindet nicht von der Benutzeroberfläche. Bitte helfen Sie mir, wie es geht.Wie UIView oder UIButton aus Superview innerhalb von UIScrollView in swift

Hier ist UIView & UIButton als Tags

var xOffset: CGFloat = 0; 
    var i = 0; 
    for location in locationNameStrs { 
     let myString: NSString = location as NSString 
     let size: CGSize = myString.sizeWithAttributes([NSFontAttributeName: UIFont(name: "HelveticaNeue", size: 13)!]) 
     outletView = UIView(frame: CGRectMake(xOffset, 10, size.width + 40, 40)) 
     outletView.tag = i 
     outletStrs = UIButton(frame: CGRectMake(0, 5, outletView.frame.size.width, 25)) 
     outletStrs.setTitle(location, forState: .Normal) 
     outletStrs.titleLabel?.textAlignment = NSTextAlignment.Center 
     outletStrs.backgroundColor = UIColor(red:0.00, green:0.45, blue:0.74, alpha:1.0) 
     outletStrs.layer.cornerRadius = 12.5 
     outletStrs.tag = i 
     outletStrs.addTarget(self, action: #selector(self.removeTags(_:)), forControlEvents: UIControlEvents.TouchUpInside) 
     outletStrs.titleLabel?.font = UIFont(name: "HelveticaNeue", size: 13)! 

     let closeImg = UIImageView (frame: CGRectMake(outletStrs.frame.size.width - 30, 0, 25, 25)) 
     closeImg.image = UIImage(named: "close") 
     closeImg.contentMode = UIViewContentMode.Right 
     outletStrs.addSubview(closeImg) 
     outletView.addSubview(outletStrs) 

     tagScrollView.addSubview(outletView) 
     xOffset = xOffset + size.width + 50 
     i = i + 1 
    } 

    tagScrollView.contentSize = CGSizeMake(xOffset + 50, 50) 

Hier ist zu entfernen, aber Problem ist die nicht verschwinden von UI

func removeTags(sender: UIButton) { 
    let ok = UIAlertAction(title: "OK", style: .Default) { (action:UIAlertAction!) in 
     if self.locationNameStrs.contains(self.locationNameStrs[sender.tag]) { 
      self.locationNameStrs.removeAtIndex(sender.tag) 
      self.outletView.removeFromSuperview() 
      self.outletStrs.removeFromSuperview() 
      self.closeImg.removeFromSuperview() 
      self.addButton.removeFromSuperview() 
      self.displayOutletTags() 
     } 
    } 
} 
+0

Haben Sie mit Debugger/Console-Ausgabe verifiziert, dass der 'if'-Zweig tatsächlich ausgeführt wird? Es macht auch keinen Sinn, etwas außer der obersten Ebene "outletView" zu entfernen. Es wird alle seine Unteransichten damit aufnehmen. – BaseZen

+0

Auch die if-Logik macht keinen Sinn, weil Sie ein Array fragen, wenn es eines seiner eigenen Mitglieder enthält. Die einzige Alternative wäre, dass "sender.tag" außerhalb der Grenzen liegt, was Ihr Programm zum Absturz bringen könnte. – BaseZen

+0

@BaseZen können Sie mir vorschlagen, wie es geht? – ppshein

Antwort

0
if self.locationNameStrs.contains(self.locationNameStrs[sender.tag]) { 
    self.locationNameStrs.removeAtIndex(sender.tag) 
    for view in self.tagScrollView.subviews { 
     if view.isKindOfClass(UIView) { 
      view.removeFromSuperview() 
     } 
    } 
    self.displayOutletTags() 
} 

Above Codierung fest zu erstellen meine Anfrage.

+0

Es gibt immer noch einen schlechten Stil und einige Missverständnisse. Siehe oben für die korrekte Verwendung eines Alert-Controllers. – BaseZen

1

Sie verwenden die Alert-API nicht ordnungsgemäß. Sie lassen das essenzielle Stück aus, das es auf den Bildschirm bringt - den View Controller selbst. Sie benötigen:

func removeTags(sender: UIButton) { 
    let alertBox = UIAlertController(title: "Removing tags", message: "I will now remove some tags.", preferredStyle: .Alert) 
    let okAction = UIAlertAction(title: "OK", style: .Default) { (action:UIAlertAction!) in 
     guard sender.tag < self.locationNameStrs.count else { 
      print("Invalid tag index \(sender.tag)!") 
      return 
     } 
     self.locationNameStrs.removeAtIndex(sender.tag) 
     self.outletView.removeFromSuperview() 
     self.dislayOutletTags() 
    } 
    alertBox.addAction(okAction) 
    self.presentViewController(alertBox, animated: true, completion: nil) 
} 

ODER

ohne Warnung, da es Ihnen scheint nicht, dass wollen:

func removeTags(sender: UIButton) { 
    guard sender.tag < self.locationNameStrs.count else { 
     print("Invalid tag index \(sender.tag)!") 
     return 
    } 
    self.locationNameStrs.removeAtIndex(sender.tag) 
    self.outletView.removeFromSuperview() 
    self.dislayOutletTags() 
} 

Sie sollten nicht über die Scroll-Ansicht werden Iterieren jeden entfernen sehen Sie finden. Dies ist zerbrechlich & ungeschicktes Design. Sie behalten bereits die hinzugefügte Ansicht im Auge, also entfernen Sie sie nach Namen.

Ihre isKindOfClass() in Ihrer Lösung macht keinen Sinn, weil per Definition die Unteransichten einer Ansicht alle Unterklassen von UIView sind.

Nochmals, Ihre if-Anweisung macht keinen Sinn, da Sie ein Element im Array betrachten und fragen, ob dieses Array es enthält.

+0

Ihr Name erwähnt nicht, welche UIView entfernt werden soll. – ppshein

+0

Es entfernt ausdrücklich 'outletView', wie Sie direkt im Code sehen. Alles, was als Unteransicht zu outletView hinzugefügt wurde, wird automatisch entfernt. Probieren Sie es aus und sehen Sie. – BaseZen

+0

Wenn ich den Code rende, kann UIView nicht angetippt werden. Andere erste/letzte UIView wird entfernt. – ppshein