【问题标题】:How to Refer to a Subview Button of Custom UIView in UITableViewController如何在 UITableViewController 中引用自定义 UIView 的子视图按钮
【发布时间】:2017-01-03 20:03:45
【问题描述】:

我遇到了 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() 中的“按钮”。 使用 实例化StarButton.subviews 中的子视图{ subview.selected = true } 抛出一个错误,说 UIView 没有“选定”成员。有没有更好的办法?

提前谢谢大家。

【问题讨论】:

    标签: ios swift uitableview uiview


    【解决方案1】:

    问题在于你的代码

    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
            })
    

    【讨论】:

    • 感谢您的回答。它真的有帮助:)。 $0 是什么意思?
    • 数组中的每个元素,这就是 $0 的含义。请检查文档是否让developer.apple.com/library/ios/documentation/Swift/Conceptual/…
    • 啊,感谢您对问题的快速回复:)。我只是查了一下 $0 来弄清楚它的含义,发现你已经回复了!非常感谢。
    【解决方案2】:

    buttonSelected 设置为 false,而您仅在按钮为 true 时更改按钮的状态。这就是您收到错误的原因。

    您可以将 buttonSelected 更改为 true,或者更好地为按钮分配一个标签,然后将该标签与 fillStar 中的“发送者”进行比较。

    【讨论】:

    • buttonSelected 设置为 false 作为默认值。它不会影响也不会解释为什么 .selected 不是我的 StarButton 的子视图的成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多