【问题标题】:How get ID selected record in UICollectionView如何在 UICollectionView 中获取 ID 选择记录
【发布时间】:2018-06-04 08:14:36
【问题描述】:

我有这个代码:

@IBOutlet weak var collectionView1: UICollectionView!
    @IBOutlet weak var collectionView2: UICollectionView!

    @IBAction func TipDetailBtnPressed(_ sender: Any) {
       showSubViewInContainerView(view: "TipDetailsView", parm: 0)
    }
    @IBAction func TipDetailPDFBtnPressed(_ sender: Any) {
        showSubViewInContainerView(view: "TipDetailsPDFView", parm: 0)
    }

    let tipObjectArray = [
        TipObject(id: 1, description: "Jakość frytek nas nie zadawala", image: UIImage(named: "a1.jpg")),
        TipObject(id: 2, description: "Kolor frytek jest niesatysfakcjonujący", image: UIImage(named: "a2.jpg")),
        TipObject(id: 3, description: "LOT i reklamacja", image: UIImage(named: "a3.jpg")),
        TipObject(id: 4, description: "Olej nie spełnia naszych oczekiwań", image: UIImage(named: "a4.jpg")),
        TipObject(id: 5, description: "jakiś fajny", image: UIImage(named: "a5.jpg"))
    ]

    let leafletsObjectArray = [
        LeafletsObject(id: 1, description: "AV-AddedValueFries-Ulotka", image: UIImage(named: "d1.jpg")),
        LeafletsObject(id: 2, description: "AV-AddedValueFries-Ulotka 23112", image: UIImage(named: "d2.jpg")),
        LeafletsObject(id: 3, description: "Ulotka", image: UIImage(named: "d3.jpg")),
        LeafletsObject(id: 4, description: "Fajna ulotka", image: UIImage(named: "d4.jpg")),
    ]


    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView1.dataSource = self
        collectionView1.delegate = self
        collectionView2.dataSource = self
        collectionView2.delegate = self
    }

    func showSubViewInContainerView(view: String, parm: Int){
        let viewController = self.parent as! MainViewControler
        viewController.showSubViewInContainerView(view: view, parms: parm)
    }
}

// MARK: - UI
extension TipViewController: UICollectionViewDelegate, UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        if collectionView == collectionView1 {
            return tipObjectArray.count
        }
        else {
            return leafletsObjectArray.count
        }
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if collectionView == collectionView1 {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell1", for: indexPath) as! TipCollectionViewCellTips
            cell.titleLabel.text = tipObjectArray[indexPath.item].description
            cell.imgView.image = tipObjectArray[indexPath.item].image
            return cell
        }
        else {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell2", for: indexPath) as! TipCollectionViewCellLeaflets
            cell.titleLabel2.text = leafletsObjectArray[indexPath.item].description
            cell.imgView2.image = leafletsObjectArray[indexPath.item].image
            return cell
        }
    }


func showSubViewInContainerView(view: String, parms: Int){
        let controller = storyboard!.instantiateViewController(withIdentifier: view)

        systemContainerView.subviews.forEach { $0.removeFromSuperview() }

        if view == "ConceptGalleryView" {
            let con =  controller as! ConceptGalleryViewController
            con.idGallery = parms
        }


        systemContainerView.addSubview(controller.view)
        addChildViewController(controller)
        controller.view.translatesAutoresizingMaskIntoConstraints = false

        systemContainerView.addSubview(controller.view)

        NSLayoutConstraint.activate([
            controller.view.leadingAnchor.constraint(equalTo: systemContainerView.leadingAnchor),
            controller.view.trailingAnchor.constraint(equalTo: systemContainerView.trailingAnchor),
            controller.view.topAnchor.constraint(equalTo: systemContainerView.topAnchor),
            controller.view.bottomAnchor.constraint(equalTo: systemContainerView.bottomAnchor)
            ])

        controller.didMove(toParentViewController: self)

        self.actualVisibleView = view
    }

}

showSubViewInContainerView 函数显示 containerView 中的视图。

我的故事板:https://i.stack.imgur.com/a39qB.png

在 TipDetailBtnPressed 和 TipDetailPDFBtnPressed 我有函数:

showSubViewInContainerView(view: "TipDetailsView", parm: 0)

在 parm - 我需要从 collectionView 项目中插入点击记录(项目)的 ID。我该怎么做?

【问题讨论】:

  • 可以使用delegate func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath),然后根据选中的collectionCell indexPath获取数组数据

标签: ios swift collectionview


【解决方案1】:
var lastTipId: Int?
var lastLeafId: Int?

//

 func collectionView(_ collectionView: UICollectionView, 
         didSelectItemAt indexPath: IndexPath) {

    if collectionView == collectionView1 {
       lastTipId = tipObjectArray[indexPath.row].id
    }
    else {
       lastLeafId = leafletsObjectArray[indexPath.row].id
    }
 }

// 在将 var 设置为函数参数之前

if selectedTipId == nil {

   // Alert the user to select a tip

   return
}
showSubViewInContainerView(view: "TipDetailsView", parm: selectedTipId!)

在其他按钮单击时相同

【讨论】:

  • 你必须先选择一个单元格或者给变量默认值
  • 你总是打印 selectedleafletId 确保 tp 使用与 btn 相对应的 var,无论它是尖端还是叶子
  • 感谢您的回答。我将代码更改为:pastebin.com/zMd3KWFv,然后得到:showSubViewInContainerView(视图:“TipDetailsPDFView”,参数:selectedleafletId!)-错误:线程 1:致命错误:在展开可选值时意外发现 nil
  • 请稍等
  • 现在我有这个:pastebin.com/xzcHhL9k 和问题:showSubViewInContainerView(view: "TipDetailsView", parm: selectedTipId!) - 无法将“TipObject”类型的值转换为预期的参数类型“Int”, selectedTipId = tipObjectArray[indexPath.row].id - 无法分配类型“Int?”的值输入“TipObject?”
【解决方案2】:

在 didselect 的帮助下,我们可以找到选择了哪些数据并在类级别保存要保存的变量

var lastTipId: Int!
var lastLeafId: Int!



func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        if collectionView == collectionView1 {
            lastTipId = tipObjectArray[indexPath.item].id
            print(lastTipId)
        }
        else {
            lastLeafId = leafletsObjectArray[indexPath.item].id
            print(lastLeafId)
        }
    }

【讨论】:

  • 它无法正常工作。您的代码返回所有项目的数量 - 而不是我点击的那个
  • 我已经更新了代码,请告诉我我会分享对我来说很好的完整代码
  • pastebin.com/Kd7vVJiH - 这是我现在的代码。这是行不通的。如果我点击按钮 - 我有这个结果:@@@@@@ nil i nil 错误消息。我在 bitbucket 中有帐户。如果你给我发电子邮件到 trifek [..@..] iCloud.com - 我会向你发送我项目的邀请
  • 您必须在集合视图中进行选择才能在 lastTipId 和 lastLeafId 中获得价值。我想你已经直接点击了按钮
  • 发送邀请邮件
猜你喜欢
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多