###前提・実現したいこと
Xcodeでアプリを作っており、
↑ボタンと↓ボタンを二つおき、
↑を押した時は数字を1プラス、↓を押した時は数字を1マイナスなのですが、
↑が押されている状態で↓が押されたら、
↑が解除されて(この時点で1マイナス)、↓が押されて(さらに数字が1マイナスされる)されるという機能を実装したいです。なにか、良い方法を教えていただけないでしょうか?
###発生している問題・エラーメッセージ
カスタムボタンなので、それぞれのクラスファイルを作り、
sharedInstanceでアクセスできるかと思っていましたが、当たり前ですが、Instanceなので、初期値になってしまい、他方のボタンが押されているかどうかにアクセスするにはどうしたらいいかわかりません。
(コードやInstanceなどの部分で解釈に間違いがありましたら申し訳ございません。)
↑が押されてる状態で、↓が押された場合に−2するのようにしたくない理由は、↑、↓ともに押されている状態と押されていない状態で画像も分けたいですし、snsの投票のような機能として実装したいのでサーバーに自分が押してるかどうかも保存したいと思っています。
###LikeButton.swift
import UIKit class LikeButton: UIButton { var like_id:String! var row:Int! var isReply:Bool = false let defaultImage: UIImage = UIImage(named: "up_arrow")! var isPressed:Bool = false struct Singleton { static let sharedInstance = LikeButton() } class var sharedInstance: LikeButton { return Singleton.sharedInstance } override func awakeFromNib() { self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside) } //押された時、押されてたらfalseにする。押されてなかったらtrueにする。 func togglePressed() { //likeボタンを押された時に、likeボタンはすでに自分で押されてたとき if isPressed == true { self.selected = false isPressed = false self.setImage(UIImage(named: "up_arrow"), forState: .Normal) println("ここまで1") //likeボタンがすでに押されてなかった時 }else{ //dislikeボタンが押されてたとき if DislikeButton.sharedInstance.isPressed == true { println("ここまで2") //dislikeボタンを解除して DislikeButton.sharedInstance.isPressed = false DislikeButton.sharedInstance.selected = false //dislikeボタンを黒に戻す行 DislikeButton.sharedInstance.setImage(UIImage(named: "down_arrow"), forState: .Normal) isPressed = true self.selected = true self.setImage(UIImage(named: "up_p_arrow"), forState: .Normal) //dislikeボタンが押されてなかった時(何も押されてなかった時) }else{ isPressed = true self.selected = true self.setImage(UIImage(named: "up_p_arrow"), forState: .Normal) println("ここまで3") } } } func buttonClicked(sender:UIButton) { if sender == self { println(DislikeButton.sharedInstance.isPressed) let cell = sender.superview?.superview as! TweetTableViewCell! // パラメータ調整 var param = [String:String]() switch cell.likeBt.isReply{ //replyから case true: println("from reply") param["tweet_type"] = Const.TWEET_TYPE.REPLY if let isMyLike = self.like_id { param["id"] = isMyLike } switch self.isPressed{ case true: //likeがおされてて、それを消す場合の処理 LikeDelete() case false: if DislikeButton.sharedInstance.isPressed == true{ //dislikeが押されてて、それを消して、likeを登録する時 DislikeButton.sharedInstance.DislikeDelete() LikePost() }else{ //何も押されてなくて、likeを登録する時 LikePost() } default: break } //replyからじゃない case false: param["tweet_type"] = Const.TWEET_TYPE.TWEET if let isMyLike = self.like_id { param["id"] = isMyLike } switch self.isPressed{ case true: //likeがおされてて、それを消す場合の処理 LikeDelete() case false: if DislikeButton.sharedInstance.isPressed == true{ //dislikeが押されてて、それを消して、likeを登録する時 DislikeButton.sharedInstance.DislikeDelete() LikePost() }else{ //何も押されてなくて、likeを登録する時 LikePost() } default: break } default: break } // ボタン切り替え、ここでisPressedが変わることに注意! togglePressed() // アニメーション self.doBounceAnimation() } } func LikePost(){ } func LikeDelete(){ } }
##DislikeButton.swift
LikeButton.swift
とlike,dislikeが入れ替わっているだけです。
import UIKit class DislikeButton: UIButton { var dislike_id:String! var row:Int! var isReply:Bool = false let defaultImage: UIImage = UIImage(named: "down_arrow")! var isPressed:Bool = false struct Singleton { static let sharedInstance = DislikeButton() } class var sharedInstance: DislikeButton { return Singleton.sharedInstance } override func awakeFromNib() { self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside) } func togglePressed() { //dislikeボタンを押された時に、dislikeボタンはすでに自分で押されてたとき if isPressed == true { self.selected = false isPressed = false self.setImage(UIImage(named: "down_arrow"), forState: .Normal) //dislikeボタンがすでに押されてなかった時 }else{ //likeボタンが押されてたとき if LikeButton.sharedInstance.isPressed == true { //likeボタンを解除して LikeButton.sharedInstance.isPressed = false LikeButton.sharedInstance.selected = false //likeボタンを黒に戻す行 LikeButton.sharedInstance.setImage(UIImage(named: "up_arrow"), forState: .Normal) isPressed = true self.selected = true self.setImage(UIImage(named: "down_p_arrow"), forState: .Normal) //dislikeボタンが押されてなかった時(何も押されてなかった時) }else{ isPressed = true self.selected = true self.setImage(UIImage(named: "down_p_arrow"), forState: .Normal) } } } func buttonClicked(sender:UIButton) { if sender == self { println(self.isPressed) let cell = sender.superview?.superview as! TweetTableViewCell! var param = [String:String]() switch cell.dislikeBt.isReply{ //replyから case true: param["tweet_type"] = Const.TWEET_TYPE.REPLY if let isMyDislike = self.dislike_id { param["id"] = isMyDislike }//is my likeがあったらそれをパラメーターにする switch self.isPressed{ case true: //dislikeがおされてて、それを消す場合の処理 DislikeDelete() case false: if LikeButton.sharedInstance.isPressed == true{ //likeが押されてて、それを消して、dislikeを登録する時 LikeButton.sharedInstance.LikeDelete() DislikePost() }else{ //何も押されてなくて、dislikeを登録する時 DislikePost() } default: break } //replyからじゃない case false: println("not from reply") param["tweet_type"] = Const.TWEET_TYPE.TWEET if let isMyDislike = self.dislike_id { param["id"] = isMyDislike } switch self.isPressed{ case true: //dislikeがおされてて、それを消す場合の処理 DislikeDelete() case false: if LikeButton.sharedInstance.isPressed == true{ //likeが押されてて、それを消して、dislikeを登録する時 LikeButton.sharedInstance.LikeDelete() DislikePost() }else{ //何も押されてなくて、dislikeを登録する時 DislikePost() } default: break } default: break } // ボタン切り替え togglePressed() // アニメーション self.doBounceAnimation() } } func DislikePost(){ } func DislikeDelete(){ } }
###補足情報(言語/FW/ツール等のバージョンなど)
xcode.6.3.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/19 08:49