didSelectItemAt 在 SCLAlertView 中不起作用

Posted

技术标签:

【中文标题】didSelectItemAt 在 SCLAlertView 中不起作用【英文标题】:didSelectItemAt not working from SCLAlertView 【发布时间】:2017-03-30 13:49:17 【问题描述】:

我正在使用 SCLAlertView 创建自定义警报视图。我的警报视图包含一个文本字段和彩色单元格的集合视图

问题是 UICollectionView 的 didSelectItemAt 方法不起作用。我认为问题是因为它就像子视图。但我无法修复它。 我在 UIViewController 有一个集合视图,并且该方法有效。这是我的代码

    var collectionViewAlert: UICollectionView!

    override func viewDidLoad() 
        super.viewDidLoad()
        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
        layout.itemSize = CGSize(width: 25, height: 25)

        collectionViewAlert = UICollectionView(frame: CGRect(x: 18, y: 10, width: 250, height: 25), collectionViewLayout: layout)
        collectionViewAlert.dataSource = self
        collectionViewAlert.delegate = self
        collectionViewAlert.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "CollCell")
        collectionViewAlert.backgroundColor = UIColor.white

    

    @IBAction func addCategory(_ sender: Any) 
        let alertView = SCLAlertView()
        alertView.addTextField("Enter category name")

        let subview = UIView(frame: CGRect(x:0,y:0,width:216,height:70))
        subview.addSubview(self.collectionViewAlert)
        alertView.customSubview = subview
        alertView.showEdit("Choose color", subTitle: "This alert view has buttons")



    



    let reuseIdentifier = "cell" // also enter this string as the cell identifier in the storyboard
    var colors = [UIColor.red, UIColor.yellow, UIColor.green, UIColor.blue, UIColor.cyan]

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return self.colors.count
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        // get a reference to our storyboard cell
        if (collectionView == self.collectionViewAlert) 
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollCell", for: indexPath as IndexPath)
            cell.backgroundColor = self.colors[indexPath.item]
            return cell
        
        else 
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath)

            cell.backgroundColor = self.colors[indexPath.item]// make cell more visible in our example project
            return cell
        

    


    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        print("You selected cell #\(indexPath.item)!")
    


更多屏幕在这里:screens

编辑:

我仍然没有找到如何解决这个问题的答案。我认为问题在于子视图交互,因为在警报显示上调用了委托方法cellForItemAt。有人知道如何解决这个问题吗?视图层次结构中的屏幕 感谢您的帮助。

【问题讨论】:

你能不能定义didSelectItemAt方法不工作。 您的收藏视图是否位于 isUserInteractionEnabled 设置为 false 的视图中? @Sulthan collectionViewAlert isUserInteractionEnable 设置为 true,子视图交互也设置为 true,但仍无法正常工作 您能否与Debug View Hierarchy 确认没有阻止选择? 查看SCLAlertView 的代码,他们使用点击识别器在文本输入之外点击时隐藏键盘。您的集合视图选择可能会发生冲突。尝试创建SCLAlertView,并将disableTapGesture 的外观设置为true 【参考方案1】:

我已经调查过SCLAlertViewcode。它似乎使用点击识别器来关闭键盘。

点击识别器可能与集合视图使用的点击识别器冲突。

要禁用SCLAlertView 中的识别器,您可以使用外观对象:

let appearance = SCLAlertView.SCLAppearance(
    disableTapGesture: true
)
let alertView = SCLAlertView(appearance: appearance)

【讨论】:

【参考方案2】:

您还可以为 CollectionView 委托添加扩展:

extension ViewController: UICollectionViewDelegate

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        print("You selected cell #\(indexPath.item)!")
    


如果您在 UICollectionViewCell 中添加了任何 UIImageView 或 UILabel,请确保您已启用 UserIntraction,因为 UIImageView 或 UILabel 默认为 false。

将 UIImageView 或 UILabel 的 UserIntraction 设置为 TRUE。

【讨论】:

【参考方案3】:

您需要在协议部分添加collectionview 委托。并确保你有你的对象的出口。

【讨论】:

【参考方案4】:

首先你需要更新如下:

class YourViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource 

然后在viewDidLoad中:

collectionView.delegate = self
collectionView.dataSource = self
collectionView.reloadData() 

并确保您的对象正确连接。

【讨论】:

感谢您的快速响应,但它不起作用。我不确定你是否明白我的问题是什么。这是完整的代码pastebin.com/saKznz2a 和一些需要理解的屏幕。 imgur.com/a/VZhT9谢谢 您是否对其进行了适当的处理......并且还要检查您的设计,确保集合视图没有隐藏在任何其他视图后面

以上是关于didSelectItemAt 在 SCLAlertView 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

didSelectItemAt 未被调用

在 didSelectItemAt 中,单元格的代表为零

为啥我的 .pushViewController 不能快速从 didSelectItemAt 工作

如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器

CollectionView 中的 CollectionView:使用 didSelectItemAt 执行Segue

UICollectionView 的 didSelectItemAt 仅在双击时调用