设置我的自定义类'委派给我的View Controller

时间:2016-08-11 19:36:36

标签: ios swift delegates protocols

我创建了一个自定义类,它是UICollectionReusableView的子类。它本质上是一个Collection View的标题标题,我在其上添加了几个按钮。按下按钮时,我希望视图控制器过滤结果(取决于按下的按钮)。

我需要我的视图控制器有一个这个自定义类的出口,但是这不起作用,因为Xcode抱怨重复的内容有类(即使我只会使用一个collectionView节头)。所以我的下一个选择是委托。

我的问题是双重的:

  1. 如何设置自定义类'委托给视图控制器?通常我会在prepareForSegue中设置代理人,但由于我没有这样做,所以我不知道该怎么做。我的视图控制器是在storyboard中创建的,我的自定义类没有引用它。即使在我的View Controller中,我也无法访问集合视图的节标题以将其委托设置为self(我查看了Apple的文档,并且没有属性可以访问节标题。)

    < / LI>
  2. 当我将IBAction设置为自定义类时,如何确保被点击的按钮也作为发件人传入?我已将其中一个按钮连接到某个操作并写了func someAction (sender: AnyObject) {}但该程序如何知道该按钮本身是作为发件人传入的?

  3. 这是我的代码:

    // Custom Class
    class CollectionHeaderView: UICollectionReusableView {
    
        @IBAction func buttonPressed (sender: AnyObject) {
            **delegate?.didTapButton(self)**
        }
        var delegate: UICollectionViewDelegate?
    }
    
    
    // Protocol
    protocol CollectionHeaderViewDelegate {
        func didTapButton(sender: CollectionHeaderView)
    }
    
    // View Controller (the delegate)
    func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
            let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "CollectionHeaderView", forIndexPath: indexPath) as! CollectionHeaderView
            headerView.delegate = self
            return headerView
        }
    
    extension BrowseViewController: CollectionHeaderViewDelegate {
        func didTapButton(sender: CollectionHeaderView) {
            print("Delegate's Button Tapped")
    
        }
    }
    

    粗体部分是Xcode给我一个错误说明的地方,&#34; UICollectionViewDelegate类型的值没有成员&#39;点按了按钮&#39;&#34; - 不确定为什么它指的是UICollectionViewDelegate .. 我尝试更改变量名称和调用以点击委托给headerViewDelegate,但它仍然给出了错误。

1 个答案:

答案 0 :(得分:1)

如果此UICollectionReusableView是集合视图的节标题,则可以在代码中创建它。您需要实施collectionView:viewForSupplementaryElementOfKind:atIndexPath:。此时,您(视图控制器)正在创建节标题,并可以您喜欢的任何方式对其进行配置。

或者,如果故事板中的流布局正在创建此UICollectionReusableView,则将故事板中的按钮放入其中,然后像往常一样连接其操作。

enter image description here

  

但程序如何知道按钮本身是作为发件人传递的

当点击按钮并触发其控制事件动作时,按钮本身始终作为参数提供。这是控件 的一部分。