2017-10-04 48 views
-1

刪除對象我有一個UIImageView設置和編程上ImageView的,我已經添加了一個「X」按鈕(取消按鈕)編程,使得當我點擊它,特定的ImageView就會消失。點擊操作(在取消按鈕上)我通過選擇器獲取。問題與來自陣列

所以,這就是我正在寫的選擇方法...

func cancelClick() { 
     imageArray.remove(at: passedIndex) 
//  imageview.removeFromSuperview() //Somthing like this has to be done 

} 

但是,這是行不通的。我認爲imageview也必須從superview中刪除,但我無法做到這一點,因爲imageview的範圍是本地的,它必須保持這種方式來處理另一個問題。 imageView可以被刪除的任何其他方式...?

而且,這是在我填充數組並在我的ImageView的設置..

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil) 


     imageArray.append(image) 

     for i in 0..<imageArray.count { 

      // The imageview set programatically & later added to the scrollview(to get horizontal scrolling images) 

      let imageView1 = UIImageView() 
      imageView1.image = imageArray[i] 
      imageView1.contentMode = .scaleAspectFit 
      let xPosition = self.view.frame.width * CGFloat(i) 
      imageView1.frame = CGRect(x: xPosition, y: 0, width: self.imageScrollView.frame.width, height: self.imageScrollView.frame.height) 

      imageView1.addSubview(viewFN) 

      imageScrollView.contentSize.width = imageScrollView.frame.width * (CGFloat(i + 1)) 
      imageScrollView.addSubview(imageView1) 

      let tap2 = UITapGestureRecognizer(target: self, action: #selector(self.cancelClick)) 
      imageView1.addGestureRecognizer(tap2) 
      imageView1.isUserInteractionEnabled = true 

      passedIndex = i 
      print(passedIndex) 
      imageView1.tag = passedIndex 
     } 
    } else { 
     //Error here 
    }   
    self.dismiss(animated: true, completion: nil) 
} 
+0

使用有什麼問題imageview.removeFromSuperview()? –

+2

你能上傳你的整個代碼嗎?我想你需要在你的func之前使用@objc cancelClick() – Siyavash

+0

爲什麼你沒有使用例如collection-view來處理動態集合? – holex

回答

0

imageArray.remove(在:passedIndex)它確實意味着,你刪除你的參考只有從array.If你想從屏幕上刪除對象的對象,您需要使用imageview.removeFromSuperview()

+0

引用來自OP:_「但是這是行不通的。我認爲imageview也必須從superview中刪除,但我無法做到這一點,因爲imageview的範圍是本地的,它必須保持這種方式處理另一個問題。imageView可以被移除的任何其他方式...?「_ – holex

+0

OP是否從mainThread調用此方法?我認爲他需要像這樣嘗試[imageview performSelectorOnMainThread:@selector(removeFromSuperview)withObject:nil waitUntilDone:NO]; –

0

這可以解決這樣的...

func cancelClick() { 
    imageArray.remove(at: passedIndex) 

    if let viewWithTag = self.view.viewWithTag(passedIndex) { 
     viewWithTag.removeFromSuperview() 
    }else{ 
     //Do something 
    } 

} 
+0

它不應該。圖像視圖將在滾動視圖中添加,而不是在主視圖中添加。 –

+0

是的..這也導致我之前提到的崩潰.. :( – bws

+0

然後,你應該刪除它:) –

0

我會建議由你已經在實施的時候做了tag屬性識別所需的圖像視圖:

imageView1.tag = passedIndex 

在這一點上,你就可以通過它的標籤來獲取圖像視圖,怎麼樣?

假設你能知道什麼是passedIndex值,因爲圖像視圖(imageView1)是imageScrollView一個子視圖,可以按如下方式得到它:

func cancelClick() { 
    imageArray.remove(at: passedIndex) 

    // it should be 'imageView1': 
    let desiredImageView = imageScrollView.subviews.filter { $0.tag == passedIndex }.first 
    desiredImageView?.removeFromSuperview() 
} 
+0

謝謝你的答案...這也適用...但有一個問題...說我補充說3張圖片。我刪除了最後一張圖片。然後它會被正確刪除。但是,如果我嘗試刪除第二張圖像,那麼會發生崩潰,因爲'索引超出範圍',因爲它沒有得到更新的索引...任何想法,我如何使imageArray獲得適當的索引..? – bws

+0

每個圖片都應該有一個您可以訪問的唯一值,顯然,讓您的所有圖片視圖都具有相同的標籤值是不恰當的,它應該增加。我建議創建一個模型包含兩個屬性:一個用於UIIMage,一個用於標記值。附加說明:如果您可以通過使用*集合視圖*來實現您想實現的目標,那麼它將爲您節省大量時間和精力。 –