簡體   English   中英

如何在UITableViewController中引用自定義UIView的子視圖按鈕

[英]How to Refer to a Subview Button of Custom UIView in UITableViewController

我在重用UITableViewCell時遇到問題,並且我收到一些建議,建議在UITableViewController中進行UIButton的操作。 問題在於,因為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()中的“按鈕”。 在InstantializedStarButton.subviews {subview.selected = true}中用於子視圖會引發錯誤,指出UIView沒有“選擇”成員。 有沒有更好的辦法?

謝謝大家。

問題出在你的代碼上

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

當您僅更改按鈕的狀態為true時,buttonSelected設置為false。 這就是為什么您得到錯誤。

您可以將buttonSelected更改為true,或者甚至可以為按鈕分配標簽,並將該標簽與fillingStar中的“發送者”進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM