2016-08-17 14 views
0

こんにちは、皆さん。私はあなたがそれをクリックすると空の星から満たされた星に変わる星型のボタンを作ろうとしています。この星はテーブルビューに含まれているため、個々のセルの右端に星があります。UIViewサブクラス:テーブルビューの星型ボタンがタッチされても反応しません

私がシミュレータを実行すると、空の星はすべて上手く表示されますが、形状を塗りつぶしに変更することはできません。私はウェブ全体を閲覧しましたが、問題の原因を解決する方法が見つかりません。

私は、星型ボタンをデザインするために作った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 
     } 
    } 
} 

}あなたがイベントを受け取るために、あなたのサブビュー、あなたの星のボタンの順にtouchesBeganとpointInsideをオーバーライドする必要が

答えて

0

。 UIButtonの選択されたメンバー変数を使用して、状態を切り替えることもできます。あなたのViewControllerで

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

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

こんにちは、あなたのアドバイスをありがとう!本当にあなたがこれに入れた努力を感謝します。 – Daniel

+0

唯一の問題は、XCodeがThread1:Signal SIGABRTエラーをスローすることです。 私はすべてのアウトレットをチェックし、インターネットからできることをしましたが、残念ながらエラーが続きます。 この問題に対するご意見はありますか? – Daniel

+1

解決済み!あなたのコードをありがとう:)。すべてがうまくいきました。ついに私はとても安心しています。 – Daniel

関連する問題