2016-07-25 19 views
0

UIScrollView内にタグとしてUIViewとUIButtonを追加するコードを実行しました。 UIScrollViewにデータを追加するにはすべてうまくいっています。問題はUIScrollView内のUIView & UIButtonを削除する方法です。削除しましたが、UIから消えません。お手伝いをしてください。ここですぐにUIScrollView内のスーパービューから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) 

としてのUIView & UIButtonを作成することで除去するものであるが、問題は、固定コーディングより上の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

また、ifロジックには意味がありません。なぜなら、配列にそれ自身のメンバーの1つが含まれているかどうかを尋ねているからです。唯一の選択肢は、 'sender.tag'があなたのプログラムをクラッシュさせる範囲外であることです。 – BaseZen

+0

@BaseZenあなたは私にどのようにお勧めすることができますか? – ppshein

答えて

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

です私の要求。

+0

まだ悪いスタイルがあり、誤解を示しています。警告コントローラを正しく使用する方法については、上記を参照してください。 – BaseZen

1

警告APIを正しく使用していません。 View Controller自体を画面に表示するために欠かせない要素は除外されています。あなたは必要とする:アラートなし

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

関連する問題