如何从swift中的UIScrollView内的超级视图中删除UIView或UIButton

问题描述:

我做了以下代码,将UIView和UIButton作为标签添加到UIScrollView中。一切工作正常,将数据追加到UIScrollView。问题是如何在UIScrollView中删除UIView & UIButton。我做了删除,但它不会从UI中消失。请帮我怎么做。如何从swift中的UIScrollView内的超级视图中删除UIView或UIButton

下面是创建的UIView &的UIButton作为标签

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) 

这里是删除,但问题是那些不从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

您是否使用调试器/控制台输出验证了“if”分支确实在执行?除了顶层'outletView'之外,删除任何东西都没有意义。它将采用它的所有子视图。 – BaseZen

+0

此外,如果逻辑没有任何意义,因为如果数组包含其自己的成员之一,则要求数组。唯一的选择是'sender.tag'超出了会导致程序崩溃的边界。 – BaseZen

+0

@BaseZen你能建议我该怎么做? – ppshein

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

消失上面的编码固定我的请求。

+0

风格依然不好,显示出一些误解。有关如何正确使用警报控制器,请参阅上文。 – BaseZen

您没有正确使用警报API。你不再需要在屏幕上显示它的关键部分 - 视图控制器本身。您需要:

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

OR

没有报警,因为它似乎你不希望出现这种情况:

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

你不应该通过滚动视图迭代,除去每查看你的发现。这是脆弱的设计。您已经跟踪添加的视图,请将其按名称删除。

您的解决方案中的isKindOfClass()没有任何意义,因为根据定义,视图的子视图都是UIView的所有子类。

同样,您的if语句没有任何意义,因为您正在查看数组中的项目,并询问该数组是否包含它。

+0

你的人没有提到哪个UIView会被删除。 – ppshein

+0

它正如你在代码中看到的那样显式地移除'outletView'。作为子视图添加到'outletView'的所有内容都会自动删除。试试看看。 – BaseZen

+0

如果我呈现你的代码,点击UIView无法移动。其他第一个/最后一个UIView被删除。 – ppshein