2016-12-07 34 views
0

好吧,我已經看過類似的帖子,如Select items programmatically in UICollectionView,並嘗試了我自己的方法,但我不能用我的程序創建的UICollectionView與Swift中選擇一個項目。Swift:無法以編程方式在UICollectionView中選擇MStickerView?

我正在構建一個iMessage擴展,並且使UICollectionview存儲自定義MSStickerViews而不是MSStickerBrowser。創建我MSStickerViews這樣,這對MSStickerView自定義類來檢測時,他們的剝離或竊聽:

var url: URL? 
     var i = 1 
     while i < 5 { //while true 
      url = Bundle.main.url(forResource: "test5", withExtension: "png") //would be "test\(i)" 
      print("URL IS THIS: \(url)") 
      guard let url = url else { break } 

      //make it a sticker 
      let sticker = try! MSSticker(contentsOfFileURL: url, localizedDescription: "test\(i)") 

      //let stickerView = InstrumentedStickerView(frame: CGRect(x: 0, y: 0, width: view.bounds.width*0.4, height: view.bounds.width*0.4)) 
      let stickerView = InstrumentedStickerView(frame: CGRect(origin: CGPoint(x: 0,y :0), size: stickerSize)) 
      stickerView.sticker = sticker 
      stickerView.delegate = self 

      starterPack.append(stickerView) 

      i += 1 
中,我從另一篇文章通過我的自定義類

然後:

protocol InstrumentedStickerViewDelegate: class { 
    func stickerViewDidSelect(stickerView: MSStickerView) 
    func stickerViewDidPeel(stickerView: MSStickerView) 
} 

class InstrumentedStickerView: MSStickerView { 
    weak var delegate: InstrumentedStickerViewDelegate? 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     for gestureRecognizer in gestureRecognizers ?? [] { 
      if let tapGestureRecognizer = gestureRecognizer as? UITapGestureRecognizer { 
       tapGestureRecognizer.addTarget(self, action: #selector(didTap)) 
      } else if let longPressGestureRecognizer = gestureRecognizer as? UILongPressGestureRecognizer { 
       longPressGestureRecognizer.addTarget(self, action: #selector(didLongPress)) 
      } 
     } 


    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func didTap(tapGestureRecognizer: UITapGestureRecognizer) { 
     if tapGestureRecognizer.state == .recognized { 
      delegate?.stickerViewDidSelect(stickerView: self) 
     } 
    } 

    func didLongPress(longPressGestureRecognizer: UILongPressGestureRecognizer) { 
     if longPressGestureRecognizer.state == .began { 
      delegate?.stickerViewDidPeel(stickerView: self) 
     } 
    } 
} 

我的問題是我需要能夠程序化(像一個按鈕)在我的集合視圖中的位置選擇我的貼紙視圖之一。意思是模擬用戶點擊貼紙並使其出現在iMessage文本輸入字段中。

我不知道如何去直接將貼紙放入輸入字段,這就是爲什麼我要使用模擬敲擊方法。

我的集合視圖有一個標題,我試圖使用以下選擇集合視圖中的項目,但儘管嘗試導航不同的行/部分時,我把0,0沒有任何反應(懷疑它是選擇頭)和其他任何要麼什麼都不做或者不會未捕獲的異常錯誤:

collectionView.selectItem(at: IndexPath(row: 0, section: 1), animated: false, scrollPosition: UICollectionViewScrollPosition.left) 

我呼籲直接從類didTap和定製funcs中,但這並沒有選擇貼紙只是調用的函數:

stickerViewDidSelect(stickers[1]) 

我ne編輯找到一種方法來觸發MSStickerView/MSSticker上的輕敲事件,以將其放入輸入字段中。我怎樣才能做到這一點?

回答

0

在collectionView中使用的indexPath不是Row和Section,而是Item和Section。在使用init您indexPath:

IndexPath(item: itemToSelect, section: 0) 

其中itemToSelect是與您希望 項目的INT和你應該能夠選擇你想要的項目。

+0

我試過,但它不工作,我得到崩潰和任何時候我把一個部分放在0以外的錯誤:***由於未捕獲異常'NSInvalidArgumentException'終止應用程序,原因:'嘗試滾動到無效索引路徑: {length = 2,path = 1 - 1}' ***第一次擲出調用堆棧: – skyguy

+0

這是一個例子,如果您的集合視圖只有一個部分, 0會導致該錯誤 –

+0

好的,謝謝,我明白現在發生了什麼,但它不工作,這意味着它不選擇MSSticker。顯然選擇集合視圖項目並不意味着選擇貼紙,我會編輯我的問題 – skyguy

相關問題