好的,我查看了类似的帖子,如Select items programmatically in UICollectionView,并尝试了我自己的方法,但我无法在程序创建的UICollectionView中使用Swift选择项目。
我正在构建一个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和自定义函数,但这并没有选择刚刚调用函数的贴纸:
stickerViewDidSelect(stickers[1])
我需要找到一种方法来触发MSStickerView / MSSticker上的点击事件,将其放入输入字段。我怎么能这样做?
答案 0 :(得分:0)
在collectionView中,使用的indexPath不是Row和Section,而是Item和Section。使用以下命令初始化indexPath:
IndexPath(item: itemToSelect, section: 0)
其中itemToSelect是包含所需项目的Int 你应该能够选择你想要的项目。