如何在UITableViewController中引用自定义UIView的子视图按钮

时间:2016-08-27 06:49:01

标签: ios swift uitableview uiview

我遇到了UITableViewCell被重用的问题,我收到的建议是让UIButton的动作发生在UITableViewController中。 问题是因为UIButton是在自定义UIView子类中实例化的,所以我找不到引用它的方法。

代码是:

class StarButton: UIView {

var buttonRow : Int = 0
var buttonSelected : Bool = false

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

required init?(coder aDecoder: NSCoder){
    super.init(coder: aDecoder)
    initStar()
}

func initStar(){

    let filledStarImage = UIImage(named: "filledStar")
    let emptyStarImage = UIImage(named: "emptyStar")

    let button = UIButton(frame: CGRect(x: 2, y: 2, width: 33, height: 33))

    button.userInteractionEnabled = true
    button.addTarget(self, action: #selector(StarButton.fillingStar(_:)), forControlEvents: UIControlEvents.TouchUpInside)

    button.setImage(emptyStarImage, forState: .Normal)
    button.setImage(filledStarImage, forState: .Selected)

    if buttonSelected == true{
        button.selected = true
    }

    addSubview(button)
}

//Could have various errors
func fillingStar(sender: UIButton){
    if (sender.selected) == false{
        FavoritesManager.favoritesList.setObject(ChemQuizCollection.wordListObject.quizList[buttonRow], forKey: "\(buttonRow)")
        sender.selected = !sender.selected
        FavoritesManager.favoritesList.synchronize()
    } else{
        FavoritesManager.favoritesList.removeObjectForKey("\(buttonRow)")
        sender.selected = !sender.selected
        FavoritesManager.favoritesList.synchronize()
    }

}

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
}

}

这是自定义的UIView子类。我想在func initStar()中引用“按钮”。 运用     for instantiatedStarButton.subviews {for subview         subview.selected = true     } 抛出一个错误,说UIView没有成员“选中”。还有更好的方法吗?

提前谢谢大家。

2 个答案:

答案 0 :(得分:2)

问题在于你的代码

StarButton.subviews{ subview.selected = true }

.subviewsUIView而非UIButtonUIView没有.selected属性

应该做的是遵循代码或类似的东西。您必须将导览UIView投射到UIButton

let filtured  =  instantiatedStarButton.subviews.filter({
            if let button = $0 as? UIButton{
                return button.selected
            }
            return false
        })

答案 1 :(得分:0)

buttonSelected设置为false,而您只更改按钮的状态(如果为true)。这就是你收到错误的原因。

您可以将buttonSelected更改为true,甚至可以更好地为该按钮指定标记,并将该标记与填充星中的“发件人”进行比较。