gpt4 book ai didi

ios - 呈现弹出 View 时,如何让用户在父 Collection View 中选择单元格?

转载 作者:行者123 更新时间:2023-11-29 05:46:21 25 4
gpt4 key购买 nike

我有一个 Collection View ,当选择一个单元格时,它会显示一个弹出 View ,显示有关该单元格的更多信息。

我想允许用户单击另一个单元格,然后将弹出窗口 View 更改为显示该单元格的信息,而无需关闭弹出窗口。如果用户要单击父 View 上不是单元格的某个位置,则弹出窗口应该关闭。但是,我希望用户仍然能够滚动 Collection View 而不关闭弹出窗口。

如何才能做到这一点?

最佳答案

根据苹果公司的说法:

When a popover is active, interactions with other views are normally disabled until the popover is dismissed. Assigning an array of views to this property allows taps outside of the popover to be handled by the corresponding views.

然后您可以使用passthroughViews通过以下方式:

CollectionViewController

import UIKit

let reuseIdentifier = "Cell"

class CollectionViewController: UICollectionViewController {

var popoverViewController : PopoverViewController?

override func viewDidLoad() {
super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
//#warning Incomplete method implementation -- Return the number of sections
return 1
}

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//#warning Incomplete method implementation -- Return the number of items in the section
return 15
}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CollectionViewCell
cell.labelInfo.text = "Cell \(indexPath.row)"
return cell
}

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

println("tapped")

if let popover = self.popoverViewController {

var cell = self.collectionView!.cellForItemAtIndexPath(indexPath) as! CollectionViewCell
popover.labelPop.text = cell.labelInfo.text

}
else {

self.popoverViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PopoverViewController") as? PopoverViewController

var cell = self.collectionView!.cellForItemAtIndexPath(indexPath) as! CollectionViewCell

var t = self.popoverViewController!.view
self.popoverViewController!.labelPop.text = cell.labelInfo.text

self.popoverViewController!.modalPresentationStyle = .Popover
var popover = self.popoverViewController!.popoverPresentationController


popover?.passthroughViews = [self.view]
popover?.sourceRect = CGRect(x: 250, y: 500, width: 0, height: 0)
self.popoverViewController!.preferredContentSize = CGSizeMake(250, 419)

popover!.sourceView = self.view

self.presentViewController(self.popoverViewController!, animated: true, completion: nil)
}
}
}

上面的代码是处理UICollectionViewController及其所有委托(delegate)的CollectionViewController

CollectionViewCell

class CollectionViewCell: UICollectionViewCell {    
@IBOutlet weak var labelInfo: UILabel!
}

内部只有一个 UILabel 的自定义单元格。

PopoverViewController

class PopoverViewController: UIViewController {

@IBOutlet var labelPop: UILabel!

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}

最后是 PopoverViewController.Popover 的形式显示。

我想在回答中指出一些观察结果:

  • 我设置了对 PopoverViewController 类的引用,以使其贯穿整个生命周期,并在其保持打开状态时向其传递数据。

  • var t = self.popoverViewController!.view 是必要的,因为如果不是 PopoverViewController 内的 @IBOutlet 就是在呈现之前不进行初始化,可能还有其他方法可以做到这一点。

  • 我在屏幕中间呈现弹出窗口,以处理多个单元格中的点击,并测试它的滚动,您可以将其显示在您想要的任何位置。

  • 在打开弹出窗口时允许的 View 中,我设置了 self.view,但这样您需要自己关闭它,因为当打开弹出窗口时它永远不会被关闭您在 View 中点击,可以放置任何您想要的 View 。

如果您在解决方案中遇到任何问题,我可以在 Github 上分享该项目。

希望对你有帮助

关于ios - 呈现弹出 View 时,如何让用户在父 Collection View 中选择单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56122228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com