当前位置: 首页 > 面试题库 >

访问UICollectionView的父UIViewController

罗金林
2023-03-14
问题内容

我的问题很简单。我有一个包含UICollectionView的UIViewController。在初始化单元格时,我向每个单元格添加了一个手势识别器,以便在按住时可以使用选择器调用一个函数。

然后,此函数创建一个我要呈现的UIAlertController。(基本上,您拥有一个单元格,它询问您是否要删除它,如果您说是,它会从CollectionView中删除它)

问题是我无法从UICollectionView中显示UIAlertController,因为它不是ViewController。

我想以编程方式从UICollectionView实现内部的函数中获取包含UICollectionView的UIViewController,以显示此警报。


问题答案:

我通过在自定义协议中制定协议来完成此任务UICollectionViewCell,并将这些事件委托给UIViewController,就像这样

在你的MyCollectionViewCell

protocol MyCollectionViewCellDelegate: class {
    func didLongPressCell()
}

class MyCollectionViewCell:UICollectionViewCell {

    weak var delegate:MyCollectionViewCellDelegate?

    func longPressAction() {
        if let del = self.delegate {
            del.didLongPressCell
        }
    }

}

然后回到你的MyViewController

class MyViewController:UIViewController, MyCollectionViewCellDelegate {

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCollectionViewCell
        cell.delegate = self
        return cell
    }

    func didLongPressCell() {
        // do what you want with the event from the cell here
    }

}

要记住的重要位是为每个单元格设置委托

cell.delegate = self

并在您要在其中接收事件的视图控制器中采用新协议

class MyViewController:UIViewController, MyCollectionViewCellDelegate

我还没有测试过这段代码,也不确定在这样的每个单元格中存储对viewController的引用的最佳实践,但是我做的非常相似,请告诉我您的情况。

编辑: 如果您已经将您的子类化,UICollectionView则将其传递给视图控制器一个引用,以便您可以像这样使用它。

MyViewController现在看起来像这样

class MyViewController:UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let collectionView = MyCollectionView()
        collectionView.viewController = self
        self.view.addSubview(collectionView)
    }

}

还有您的自定义收藏夹视图MyCollectionView

class MyCollectionView:UICollectionView, MyCollectionViewCellDelegate {

    weak var viewController:UIViewController?

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCollectionViewCell
        cell.delegate = self
        return cell
    }

    func didLongPressCell() {
        if let vc = self.viewController {
            // make use of the reference to the view controller here
        }
    }

}

UICollectionViewCell会和以前一样



 类似资料:
  • 我正在尝试访问在“MyClass”的@RequestMapping父级中定义的@PathVariables。简化的screnario: 此类是某种产品的基类,不应进行编辑。因此,我扩展了“父类”。在“MyClass”中,我想做如下操作: 我认为这是允许的(还没有测试),但我不知道如何获得所有已经用“ParentClass”定义的PathVariable。 非常感谢您的任何想法/RTFM参考。

  • 问题内容: 好的,我有一个页面,在此页面上有一个iframe。我需要做的是在iframe页面上,找出主页的URL。 我进行了搜索,我知道如果我的iframe页面位于其他域上是不可能的,因为这是跨站点脚本。但是,我读过的所有内容都说,如果iframe页面与父页面位于同一域中,那么例如,它应该可以工作: …或其他类似的组合,因为似乎有多种获取相同信息的方法。 无论如何,这就是问题所在。我的iframe

  • 怎么可以让这个 self.logger 属于子类(不是直接添加到子类属性这种方式),并且可以运行

  • 问题内容: 问题:如何在子项中显示父变量?预期结果将回显“父母bb” 问题答案: 该变量是继承的并且不是私有的,因此它是当前对象的一部分。 以下是其他信息,可应您的要求提供有关使用的更多信息: 当您要向父类的方法 添加其他 功能时使用。例如,想象一个类: 现在,假设我们要创建一种同时具有导航器的新型飞机。您可以扩展__construct()方法以添加新功能,但仍可以使用父级提供的功能: 这样,您可

  • 问题内容: 就像是 这是我想象的格式,但事实并非如此。什么会退回到对象的父级? 问题答案: JavaScript本身不提供此功能。而且我怀疑您是否可以创建这种类型的功能。例如: 鲍比属于谁?

  • 问题内容: 我有一个可以打电话的页面。在此页面中,我有一个带有提交表单的表单,除此之外,我还有一个ID为“ target”的div。是否可以在iframe中提交表单,并在成功刷新后刷新目标div。是说要在其中加载新页面? 编辑:目标div在父页面中,所以我的问题基本上是,是否可以在iframe之外向父对象进行jQuery调用的示例。那看起来如何? 编辑2:这就是我的jquery代码现在的样子。它位