首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:不能在UICollectionView中以编程方式选择MStickerView吗?

Swift:不能在UICollectionView中以编程方式选择MStickerView吗?
EN

Stack Overflow用户
提问于 2016-12-07 08:54:15
回答 1查看 454关注 0票数 0

好吧,我看过类似的帖子,比如Select items programmatically in UICollectionView,并尝试了我自己的方法,但我不能在我用Swift以编程方式创建的UICollectionView中选择一个项目。

我正在构建一个iMessage扩展,并且我创建了UICollectionview来存储自定义的MSStickerViews,而不是MSStickerBrowser。我像这样创建我的MSStickerViews,它在MSStickerView上有一个自定义类来检测它们何时被剥离或点击:

代码语言:javascript
复制
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

然后在我的自定义类中,我从另一篇文章中采用了:

代码语言:javascript
复制
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时尝试导航不同的行/节,但没有发生任何事情(怀疑它正在选择标题),其他任何东西要么什么都不做,要么没有捕获异常错误:

代码语言:javascript
复制
collectionView.selectItem(at: IndexPath(row: 0, section: 1), animated: false, scrollPosition: UICollectionViewScrollPosition.left)

我已经直接从类中调用了didTap和自定义函数,但这并没有选择只是调用函数的贴纸:

代码语言:javascript
复制
stickerViewDidSelect(stickers[1])

我需要找到一种方法来触发MSStickerView/MSSticker上的点击事件,以便将其放入输入字段中。我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2016-12-07 09:26:16

在collectionView中,使用的indexPath不是行和节,而是项和节。使用以下命令初始化indexPath:

代码语言:javascript
复制
IndexPath(item: itemToSelect, section: 0)

其中,itemToSelect是一个包含所需项的整数,您应该能够选择所需项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41007628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档