UIView子类:表格视图中的星形按钮在触摸时不会做出相应的反应

时间:2016-08-17 05:45:42

标签: swift xcode xcode7

大家好。我试图制作一个星形按钮,当你点击它时,它会从空星变为填充星,反之亦然。这颗星被包含在一个表格视图中,因此每个单独的单元格在最右侧都有一颗星。

问题在于,当我运行模拟器时,空星显示一切都很好,但是我不能让它变成一个填充的形状。我浏览了整个网络,但无法找到导致问题的解决方案。

我包含了我用来设计星形按钮的UIView子类。

此外,这是我第一次使用stackoverflow,所以如果有更好的方式来表达问题,或者更好的方式来获得帮助,请告诉我。

提前谢谢大家。

import UIKit

class StarFilling: UIView {

//MARK: Properties
var marking = 0{
    didSet {
        setNeedsLayout()
    }
}
var starList = [UIButton]()

// MARK: Initialization

required init?(coder aDecoder: NSCoder){

    super.init(coder: aDecoder)
    let filledStarImage = UIImage(named: "filledStar")
    let button = UIButton(frame: CGRect(x: 0, y: 0, width: 33, height: 33))

    button.addTarget(self, action: "fillingStar", forControlEvents: UIControlEvents.TouchDown)
    button.setImage(emptyStarImage, forState: .Normal)
    button.setImage(filledStarImage, forState: .Selected)
    button.setImage(filledStarImage, forState: [.Highlighted, .Selected])

    addSubview(button)
}

// MARK: Button Action
func fillingStar(button: UIButton){
    if(marking == 0){
        marking = 1
    }
    else{
        marking = 0
    }
    updateButtonSelectionStates()
}

func updateButtonSelectionStates(){
    if(marking==1){
        for button in starList{
            button.selected = true
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

您需要覆盖touchesBegan和pointInside才能使您的子视图(星形按钮)接收事件。您还可以使用UIButton的选定成员变量来切换状态。

class StarFilling: UIView {

  override init (frame : CGRect)
  {
    super.init(frame : frame)
    initStar()
  }

  convenience init ()
  {
    self.init(frame:CGRect.zero)

  }

  required init?(coder aDecoder: NSCoder){

    super.init(coder: aDecoder)
    initStar()
  }

  func initStar()
  {
    let filledStarImage = UIImage(named: "star_filled")
    let emptyStarImage = UIImage(named: "star_empty")

    let button = UIButton(frame: CGRect(x: 300, y: 100, width: 100, height: 60))

    button.userInteractionEnabled = true
    button.addTarget(self, action: #selector(StarFilling.fillingStar(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    button.setImage(emptyStarImage, forState: .Normal)
    button.setImage(filledStarImage, forState: .Selected)

    addSubview(button)
  }
  // MARK: Button Action
  func fillingStar(sender : UIButton)
  {
    sender.selected = !sender.selected
  }

  override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
  {
    for view in subviews
    {
      view.touchesBegan(touches, withEvent: event)
    }
  }

  override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool
  {
    return true
  }
}

在ViewController中:

let star = StarFilling()
star.userInteractionEnabled = true
self.view.addSubview(star)