2016-08-27 5 views
0

UITableViewCellの問題が再利用されており、UITableViewController内でUIButtonの動作を行うよう提案しています。 問題は、UIButtonがカスタムUIViewサブクラス内でインスタンス化されるため、参照する方法が見つからないことです。UITableViewControllerのカスタム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()の "button"を参照したいと思います。 インスタンス化されたStarButton.subviewsのサブビュー{ subview.selected = true } は、UIViewにメンバーが「選択済み」でないというエラーをスローします。より良い方法がありますか?

ありがとうございます。

答えて

1

問題が

StarButton.subviews{ subview.selected = true } 

.subviewsはないUIButtonUIViewを与え、あなたのコードである:UIViewには.selectedプロパティ

何を行うべきであるが、次のされているコードまたは類似した何かを持っていません。あなたはbuttonSelectedは、デフォルト値としてfalseに設定されているUIButton

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

ありがとうございました。それは本当に助け:)。 $ 0はどういう意味ですか? – Daniel

+0

配列内のすべての要素は、$ 0の意味です。 の場合はドキュメントを確認してください。https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html – renjithr

+0

質問に素早く返信いただきありがとうございます:)私はちょうどその意味を理解するために$ 0を見て、あなたがすでに応答したことを認識しました!どうもありがとう。 – Daniel

0

buttonSelectedは、trueの場合にのみボタンの状態を変更している間はfalseに設定されます。だからあなたはエラーを受けている。

buttonSelectedをtrueに変更するか、ボタンにタグを割り当てて、そのタグをfillStarの '送信者'と比較することができます。

+0

にツアーUIViewをキャストする必要があります。 .selectedが私のStarButtonのサブビューのメンバーではない理由には影響しません。 – Daniel

関連する問題