質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1963閲覧

Swift ボタンを長押し ボタンのタグでアクションを変える

vitoyaokatsu

総合スコア12

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/11/26 04:25

編集2020/11/26 09:55

SEButtonを複数個持っており、下記のコードでレイアウトさせました。
タップ以外にも長押し出機能を追加したいと思い
let longPress = UILongPressGestureRecognizer(target: self, action: #selector(self.resetSEday(_:)))
button.addGestureRecognizer(longPress)
を書き加えました。

その下にある
@objc func resetSEday(_ gesture: UILongPressGestureRecognizer) {
guard (gesture.view as? UIButton) != nil else {
print("Sender is not a button")
return
}

switch (gesture.state) { case .began: print("longPress start") case .ended: print("longPress end") default: break }

case .ended:以下に
タグによってアクションを分岐させようとしたのですが
タグの識別方法がわかりません。
苦し紛れに
@objc func resetSEday(_ gesture: UILongPressGestureRecognizer) のところに
@objc func resetSEday(_ gesture: UILongPressGestureRecognizer, _ sender:UIButton)と書き加えてみたのですが
エラーとなりました。
どのように書けば良いのかお教えください。

swift5

1 //SEButton layout setting 2 private func setSEButtonLayout(button: UIButton, left: Int, top: Int, tag: Int, text:String){ 3 4 let btnRect = getButtonRect(left: left, top: top) 5 6 button.frame = btnRect 7 button.backgroundColor = UIColor.seButtonColor 8 9 button.titleLabel?.numberOfLines = 2 10 button.titleLabel?.textAlignment = .center 11 button.titleLabel?.font = UIFont.systemFont(ofSize: doubleLetterBtnFontSize) 12 button.setTitle(text, for: UIControl.State.normal) 13 button.setTitle("", for: UIControl.State.highlighted) 14 button.setTitleColor(.white, for: UIControl.State.normal) 15 16 button.layer.masksToBounds = true 17 button.layer.cornerRadius = btnRect.size.width / 2 18 19 button.tag = tag 20 21 //button action 22 button.addTarget(self, action: #selector(setSEDay(_:)), for: .touchUpInside) 23 //kokokara 24 let longPress = UILongPressGestureRecognizer(target: self, action: #selector(self.resetSEday(_:))) 25 button.addGestureRecognizer(longPress) 26// button.addTarget(self, action: #selector(setSEDay(_:)), for: .) 27 } 28 29 @objc func resetSEday(_ gesture: UILongPressGestureRecognizer) { 30 guard (gesture.view as? UIButton) != nil else { 31 print("Sender is not a button") 32 return 33 } 34 35 switch (gesture.state) { 36 case .began: 37 print("longPress start") 38 case .ended: 39 print("longPress end") 40 default: 41 break 42 43 } 44 45 46 } 47 48 // 長押しされたボタンは sender.tag で判別

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/11/26 07:53

ご質問が途中で終わっているように思えます。 もし記述途中であれば、問題点がわかるようにしていただけますでしょうか。
vitoyaokatsu

2020/11/26 10:01

いつもありがとうございます。 質問が途中になってしまって申し訳ございませんでした。 最後まで書きました。よろしくお願いいたします。 ちなみに 他人の記事を参考にしました。 そこにはタグで処理できるとも書かれていましたが その後難しすぎて理解できず 進めませんでした。 https://qiita.com/Todate/items/90f2725430168e9a73ac です。 ご指導、よろしくお願いたします。 よく理解できていません。
guest

回答1

0

ベストアンサー

参考にされた記事で使われた記事での guard-let 節の使い方をそのまま使えば、次のような感じで tag の番号を見ることができます(ちなみに、UIViewtag というプロパティは持っているため、ダウンキャストは必須ではありません)。

Swift

1@objc func resetSEday(_ gesture: UILongPressGestureRecognizer) { 2 // guard-let 節で button に gesture.view を UIButton としてダウンキャストした値を入れる 3 guard let button = gesture.view as? UIButton else { 4 print("Sender is not a button") 5 return 6 } 7 8 switch (gesture.state) { 9 case .began: 10 print("longPress start") 11 12 // tag の値を表示する 13 print("tag ", button.tag) 14 15 case .ended: 16 print("longPress end") 17 18 default: 19 break 20 21 } 22 }

余談ですが、各ボタンのインスタンスがわかっているのであれば、tag をつけなくても switch-case でインスタンスのパターンマッチを行わせることで、押されたボタンを判断することも可能です。

自分でタグの値を管理するとなると、値の重複が会った時などにデバッグしづらいので、こちらの方法も検討されてみるといいかもしれません。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet weak var button1: UIButton! 5 @IBOutlet weak var button2: UIButton! 6 @IBOutlet weak var button3: UIButton! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view. 11 setSEButtonLayout(button: button1) 12 setSEButtonLayout(button: button2) 13 setSEButtonLayout(button: button3) 14 } 15 16 func setSEButtonLayout(button: UIButton){ 17 let longPress = UILongPressGestureRecognizer(target: self, action: #selector(self.resetSEday(_:))) 18 button.addGestureRecognizer(longPress) 19 } 20 21 @objc func resetSEday(_ gesture: UILongPressGestureRecognizer) { 22 // guard-let 節で button に gesture.view を UIButton としてダウンキャストした値を入れる 23 guard let button = gesture.view as? UIButton else { 24 print("Sender is not a button") 25 return 26 } 27 28 switch (gesture.state) { 29 case .began: 30 print("longPress start") 31 32 // 押されたボタンの判断 33 whichButton(button) 34 35 case .ended: 36 print("longPress end") 37 38 default: 39 break 40 41 } 42 } 43 44 func whichButton(_ button: UIButton) { 45 // インスタンスでパターンマッチさせる 46 switch button { 47 case button1: 48 print("一つめ") 49 case button2: 50 print("二つめ") 51 case button3: 52 print("三つめ") 53 default: 54 print("関係ないボタン") 55 } 56 } 57}

投稿2020/11/26 11:49

編集2020/12/11 00:40
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vitoyaokatsu

2020/11/27 03:38

回答ありがとうございます。 やってみたのですが Can't find gesture.view in scopeと怒られました。 gesture.viewというものをボタンに付け加えなければならないのですか?
vitoyaokatsu

2020/11/27 03:41

すいません、コード間違っていました、もう一度試します。ごめんなさい。
vitoyaokatsu

2020/11/28 03:49

動かなかった原因は掴めてませんが、完全に動くようになりました。ありがとうございました。 インスタンスでパターンマッチの部分も参考になりました。 アドバイスの通りタグの管理も含めてまた検討していきたいと思います。 また、ご指導よろしくお願いいたします。
vitoyaokatsu

2020/12/11 00:13

別件でインスタンスでのパターンマッチさせてみました。 可読性が向上するということも、自分の師匠からアドバイスいただきました。 今後とも色々教えてください。 相互フォローしていただけるとありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問