好吧,我已經看過類似的帖子,如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以外的錯誤:***由於未捕獲異常'NSInvalidArgumentException'終止應用程序,原因:'嘗試滾動到無效索引路徑: {length = 2,path = 1 - 1}' ***第一次擲出調用堆棧: –
skyguy
這是一個例子,如果您的集合視圖只有一個部分, 0會導致該錯誤 –
好的,謝謝,我明白現在發生了什麼,但它不工作,這意味着它不選擇MSSticker。顯然選擇集合視圖項目並不意味着選擇貼紙,我會編輯我的問題 – skyguy