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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

2回答

3463閲覧

UILabelの長押しイベントについて

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

2クリップ

投稿2018/02/27 03:06

編集2018/02/28 14:13

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 var item = String() 6 var add = UILabel() 7 //+ボタン 8 @IBAction func addlabel(_ sender: Any) { 9 10 alert() 11 //label() 12 } 13 14 //ラベルについて 15 func label(){ 16 add = UILabel(frame: CGRect(x: 130, y:250, width: 100, height:20)) 17 //ラベルの大きさ、座標指定 18 add.text = "labelです" 19 //文字を変更 20 21 add.backgroundColor = UIColor.lightGray 22 23 add.font = UIFont.systemFont(ofSize: 30) 24 //文字の大きさ 25 26 add.textColor = UIColor.black 27 //文字カラー 28 29 add.sizeToFit() 30 //文字数にあわせてlabelの大きさを変更(サイズが文字にフィットする) 31 32 self.view.addSubview(add) 33 //実際にviewに見える形でlabelが出現する 34 } 35 36 func alert(){ 37 // テキストフィールド付きアラート表示 38 39 let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) 40 41 // OKボタンの設定 42 let okAction = UIAlertAction(title: "OK", style: .default, handler: { 43 (action:UIAlertAction!) -> Void in 44 45 // OKを押した時入力されていたテキストを表示 46 if let textFields = alert.textFields { 47 48 // アラートに含まれるすべてのテキストフィールドを調べる 49 for textField in textFields { 50 self.label() 51 self.add.text = textField.text! 52 self.add.sizeToFit() 53 print(textField.text!) 54 } 55 // UILongPressGestureRecognizerインスタンス作成 56 let longPressGesture = UILongPressGestureRecognizer(target: self, action: Selector(("longPressGesture"))) 57 //デリゲート先を自分に設定する。 58 //longPressRecognizer.delegate 59 // 時間(デフォルト0.5秒) 60 longPressGesture.minimumPressDuration = 0.5 61 self.add.isUserInteractionEnabled = true 62 self.add.addGestureRecognizer(longPressGesture) 63 } 64 }) 65 alert.addAction(okAction) 66 67 // キャンセルボタンの設定 68 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 69 alert.addAction(cancelAction) 70 71 // テキストフィールドを追加 72 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 73 textField.placeholder = "テキスト" 74 }) 75 76 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 77 78 // アラートを画面に表示 79 self.present(alert, animated: true, completion: nil) 80 81 } 82 83 func longpress(sender: UILongPressGestureRecognizer){ 84 85 alert() 86 } 87 override func viewDidLoad() { 88 super.viewDidLoad() 89 90 /*// UILongPressGestureRecognizerインスタンス作成 91 let longPressGesture = UILongPressGestureRecognizer(target: self, action: Selector(("longPress:"))) 92 93 // 時間(デフォルト0.5秒) 94 longPressGesture.minimumPressDuration = 1.0 95 96 add.isUserInteractionEnabled = true 97 add.addGestureRecognizer(longPressGesture)*/ 98 99 } 100 101 override func didReceiveMemoryWarning() { 102 super.didReceiveMemoryWarning() 103 // Dispose of any resources that can be recreated. 104 } 105 106 107} 108

ラベルを長押しした時にalertを呼び出す実装をしたいです。
ですが、長押しした時にalertを呼び出せずに困っています。

イメージ説明

alert追加時に同時にlongpressの処理についても書いたの見て、実行して見たらlabelをタップした時にsignalbrtで落ちました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

セレクタの指定の仕方と、そもそもセレクタに指定しているファンクション自体が間違っているからでしょう。
Swift4であればファンクションの頭に@objcが必要です。

Swift

1 2 //let longPressGesture = UILongPressGestureRecognizer(target: self, action: Selector(("longPressGesture"))) 3 let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longpress(sender:))) 4 5 6 @objc func longpress(sender: UILongPressGestureRecognizer){ 7 alert() 8 } 9 10// Swift 4

投稿2018/02/28 17:33

fromageblanc

総合スコア2724

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

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

退会済みユーザー

退会済みユーザー

2018/03/01 01:11

なるほど。@objcがなんですね。swift4にはしたのですが変更点についてはあまり把握していませんでした。
guest

0

ラベルは初期設定ではタッチイベントを受け付けないので受け付けるように設定。
sotryBoardでは、user Interaction Enabled という項目にチェックを付けるので、
コードではそれらしいラベルのプロパティをtrueにするのかな?
その後に、

設定してありますね。
↓これでプリントされませんか?
プリントされたらアラート出してみて。

swift

1func longpress(sender: UILongPressGestureRecognizer){ 2 // 長押し開始〜 3 if(sender.state == UIGestureRecognizerState.began) { 4   // 長押し終了。 5 } else if (sender.state == UIGestureRecognizerState.ended) { 6 7 print("ロングタップされたよ。") 8 9 } 10} 11

投稿2018/02/27 08:23

編集2018/02/27 08:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/02/27 10:01

printされませんでした。分からないのですがもしかしたらlabelと長押しのコードが繋がっていないのかなと思うのですがどうでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/27 10:09

自分はSB派なのでコードでレコグナイザを設定するのは詳しくないのですが、 ターゲットとなるラベルがUserInteractionEnabled = trueになってはいないですね。 あーラベルとレコグナイザを接続する記述がないですね。 そのへん自分が過去につくっての調べてみますね。
退会済みユーザー

退会済みユーザー

2018/02/27 10:16

viewDidLoadのなかの レコグナイザをインスタンス化してるところで レコグナイザのターゲットを指定して、 対象物.addGestureRecognizer(longPressGesture) ラベルの設定の中で 対象ラベル.UserInteractionEnabled = true かな? これでどうでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/27 10:21

対象ラベルとは var add = UILabel()この部分のことでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/27 10:33

そうなんだけど、 自分StoryBoardでUI部品を配置してるからコードでつくることないんだけど、 ラベルを定義してつくる部分がfuncになってない?これ。 アラートのボタン押すまでラベルは画面に出てこないの?
退会済みユーザー

退会済みユーザー

2018/02/27 10:39

>>対象ラベルとは var add = UILabel()この部分のことでしょうか? ロングタップしたいラベルのプロパティUserInteractionEnabledをtrueにしてみて ください。
退会済みユーザー

退会済みユーザー

2018/02/27 10:39

そうですね。アラートで入力したtextがラベルとして初めて画面に出てくる形ですね。そして今回やりたいこととしては出て来たラベルに対し、うち間違えなどで編集を加えたい時に長押しをし、そこから再度アラートを呼び出すのがやりたいことです。
退会済みユーザー

退会済みユーザー

2018/02/27 10:42

add.isUserInteractionEnabled = true にしています。
退会済みユーザー

退会済みユーザー

2018/02/27 11:00

最初からラベルが画面にあったらだめなのかな〜? 作ったラベルの名前がないとadd.addGestureRecognizer(longPressGesture)できないし。 add.addGestureRecognizer(longPressGesture)するとすると、 viewDidLoadのなかで view.UILabel?.first?.add.addGestureRecognizer(longPressGesture) とかになるんだろうけど、 viewDidLoadの時点でラベルがないから、 viewDidLoadの時点で存在しないものにアッドレコグナイザしてもうごかないかな? できないだろうからラベルを作る段階で 作られるラベル設定のなかで、add.addGestureRecognizer(longPressGesture) するのかな?
退会済みユーザー

退会済みユーザー

2018/02/27 11:14

そうですね、最初からあるのだと必要のない時にずっとラベルがあっても困るのでこのような形にしました。 ラベルを作る段階ですとalert()内にlongpressについて書けばいいのでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/27 11:16

ああごめん。 addはUILabelなのね。よく読まず勘違いしてました。
退会済みユーザー

退会済みユーザー

2018/02/27 11:18

見てて違和感があったんだけどラベルって画面にいっぱい表示するの? いっぱい出すならテーブルビューとかのほうが自然な気がするんだけど。
退会済みユーザー

退会済みユーザー

2018/02/27 11:26

現状の自分実力ではまだ一個しか表示させるやり方しか分からないのですが最終的には沢山出す感じにするつもりです。 それとその際にtableViewも利用する気ですが、一回の質問にまとめるとよくないと指摘されたことがあったのでまず一つずつ分からない事を解決していこうとこのような形にしました。
退会済みユーザー

退会済みユーザー

2018/02/28 17:09 編集

画面にラベルを一個はって、 そこにアラートを表示して、その1つのラベルの内容を書き換えるように して ロングタップによるアラート表示を確実に行えるようになってから、 次の段階として アラートによって生成したラベルをロングタップできるようにできますか? にしたほうが先にすすめると思いますよ。 「一回の質問にまとめるとよくないと指摘された」というのはそういうことだと 思います。
退会済みユーザー

退会済みユーザー

2018/02/27 21:50

git見て見たのですが何もそのような記述がありませんでした。おそらく、誤アップロードしたのではないかと思うのですが確認して頂けませんでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/27 21:52

githubでサンプルがダウンロードできる画面は表示されますか?
退会済みユーザー

退会済みユーザー

2018/02/27 21:55 編集

あれ?見れますよ。 ま、サンプル上げてみたので興味がありましたらどうぞ。
退会済みユーザー

退会済みユーザー

2018/02/28 11:02

ダウンロードして実行して見たのですがコードとかデフォルトのコードしかありませんでした。
退会済みユーザー

退会済みユーザー

2018/02/28 11:03

なので実行してもなにも起こりまでんでした。
退会済みユーザー

退会済みユーザー

2018/02/28 17:09

IBを使ったサンプルですが、参考になるかなと思い、コミットし直しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問