如何在填充集合视图时判断是否选择了集合视图标题中的按钮?

时间:2016-08-22 07:19:19

标签: swift button header collectionview

在填充我的集合视图时,如何判断是否在集合视图标题中选中了按钮?我在标题中有2个选项卡,用于确定我在集合视图中填充的数据,因此我希望能够在用户选择其他选项卡时切换数据并重新加载集合视图。

来自标题类的一些代码按照要求...虽然它只是一个按钮,但我看不到这一点。我想在填充单元格和单元格数等时查看是否选中了此按钮。

class UserSearchHeader: UICollectionReusableView {

@IBOutlet weak var friendsButton: UIButton!
@IBOutlet weak var peopleButton: UIButton!
@IBOutlet weak var customSlider: UIView!

override func awakeFromNib() {
    super.awakeFromNib()
    self.friendsButton.selected = true
    customSlider.layer.cornerRadius = customSlider.frame.height / 2

}

@IBAction func friendsButtonTapped(sender: AnyObject) {
    if self.friendsButton.selected == false {
        self.friendsButton.selected = true
        self.peopleButton.selected = false
        UIView.animateWithDuration(0.3, animations: { () -> Void in
            self.customSlider.frame.origin.x = 0
        })
    }
}

2 个答案:

答案 0 :(得分:2)

有两种委托方法对决定显示哪些项目非常重要。例如:

您有两个不同的项目,它们填充在:

let items1 = [Item]()
let items2 = [Item]()

然后你有一个变量,它保存应该显示的项目:

let items1Shown:Bool = true

现在使用类似的方法实现委托方法:

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
   if(items1Shown == true) {
      return items1.count
   } else {
      return items2.count
   }
}

并且

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

   var item:Item!

   if(items1Shown == true) {
      item =  items1[indexPath.row]
   } else {
      item =  items1[indexPath.row]
   }

   // format your cell 

}

并实现任何按钮功能

func ChangeItems() {
   if(items1Shown == true) {
      items1Shown = false
   } else {
      items1Shown = true
   }

   // reload your collectionView

   self.collectionView.reloadData()

}

修改:

为什么不给你的按钮作为目标? (在你将headerView出列的地方添加它!)

headerView.friendsButton.addTarget(self, action: #selector(YourViewControllerWithFunction.cellButtonClick(_:)), forControlEvents: .TouchUpInside)

//例如:

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
    let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: headerId, forIndexPath: indexPath)

    headerView.friendsButton.addTarget(self, action: #selector(YourViewControllerWithFunction.cellButtonClick(_:)), forControlEvents: .TouchUpInside)

    return headerView
}

//类YourViewControllerWithFunction

func cellButtonClick(button: UIButton) {
    // you can do anything with that button now 
}

答案 1 :(得分:1)

UICollectionviewHeader + UI按钮
UIcollectionviewHeader正在使用dequeueReusableSupplementaryView,并且由于某种原因它创建了每个Headerview的UIView Infront,这将阻止正在发生的所有手势。解决方案是将视图放在前面:

override func awakeFromNib() {
   super.awakeFromNib()
   self.bringSubview(toFront: friendsButton) // this depends on you .xib
}

这将解决您的手势问题。

Theres在CollectionViewHeader中创建UIButton操作的多种方法。

  • AddTarget(由@derdida回答)
  • 在CollectionViewHeader类中拖放操作。

添加目标: - (请参阅derdida答案)
viewForSupplementaryElementOfKind 之内// ps:你需要注册你的CollectionView Class&笔尖

  1. 像这样将目标添加到UIButton。
  2. header.friendsButton.tag = 0
    header.friendsButton.addTarget(self, action: #selector(self.HeaderClick(_:)), for: .touchUpInside)

    1. 如此创建函数。
    2. @objc func HeaderClick1(_ sender : UIButton){ print("sender.tag \(sender.tag)") }//sender.tag 0

      在CollectionViewHeader类中拖放操作。
      对于这个例子,我将使用@Wayne Filkins问题。

      1. Ctrl +将UIButton拖到标题类
      2. 选择连接类型为操作创建功能
      3. @IBAction func friendsButtonTapped(_ sender: Any) { print("something from friendsButtonTapped") }

        就是这样。

        但这里的主要关键是将视图放在前面。使用调试视图层次结构来了解更多。

        有人可以修复我的代码视图!