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

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

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

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

Q&A

解決済

2回答

2274閲覧

swift 特定の文字を含むラベルを探す方法

torkia

総合スコア24

Swift

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

0グッド

1クリップ

投稿2018/01/18 03:22

Swift3にて、複数のラベルの中から特定の文字列が含まれているラベルを探し出し、そのラベルを特定する方法を知りたいです。

<試したこと>
.contains で特定の文字列が含まれているかを、複数あるラベルにそれぞれ同じコードを記述して確認させ、trueの場合の処理をその都度記述するやり方にしています。

できれば、複数のラベルを配列などに入れて、for-in文などで繰り返し処理をし特定できればと思ってます。(UILabelは配列には入れられないのでしょうか?やってみたのですが、エラーがでます。)
もしくは、.contains 以外で、複数あるラベルの中から特定の文字列を含むラベルを見つける方法があれば教えて頂きたいです。

サンプルコード Swift3 xcode8

class ViewController: UIViewController { var qArray:[String] = [] let q1Label = UILabel() let q2Label = UILabel() let q3Label = UILabel() let q4Label = UILabel() let q5Label = UILabel() let q6Label = UILabel() let q7Label = UILabel() let q8Label = UILabel() let q9Label = UILabel() let q10Label = UILabel() override func viewDidLoad() { super.viewDidLoad() // q1Label作成 q1Label.text = qArray[5] q1Label.frame = CGRect(x: 20, y: 230, width: 335, height: 30) q1Label.textColor = UIColor.black q1Label.font = UIFont.systemFont(ofSize: 12) q1Label.backgroundColor = .lightGray view.addSubview(q1Label) // ■の文字が含まれていればラベルの色を変更する if (q1Label.text?.contains("■"))! { q1Label.backgroundColor = .cyan } // ラベルの文字数が22より多ければ改行させる if (q1Label.text?.characters.count)! > 22 { q1Label.numberOfLines = 0 q1Label.sizeToFit() // ラベルの高さをプラスする q1Label.frame.size.height += 21 // ラベルのframeを再設定 q1Label.frame = CGRect(x: 20, y: 230, width: 335, height: q1Label.frame.size.height) } // q2Label作成 let q2Y = q1Label.frame.origin.y + q1Label.frame.size.height q2Label.text = qArray[7] q2Label.frame = CGRect(x: 20, y: q2Y, width: 335, height: 30) q2Label.textColor = UIColor.black q2Label.font = UIFont.systemFont(ofSize: 12) q2Label.backgroundColor = .lightGray view.addSubview(q1Label) // ■の文字が含まれていればラベルの色を変更する if (q2Label.text?.contains("■"))! { q2Label.backgroundColor = .cyan } // ラベルの文字数が22より多ければ改行させる if (q2Label.text?.characters.count)! > 22 { q2Label.numberOfLines = 0 q2Label.sizeToFit() q2Label.frame.size.height += 21 q2Label.frame = CGRect(x: 20, y: q2Y, width: 335, height: q2Label.frame.size.height) }      ・      ・      ・ (略)      ・      ・      ・ // q10Label作成 let q10Y = q9Label.frame.origin.y + q9Label.frame.size.height q10Label.text = qArray[23] q10Label.frame = CGRect(x: 20, y: q10Y, width: 335, height: 30) q10Label.textColor = UIColor.black q10Label.font = UIFont.systemFont(ofSize: 12) q10Label.backgroundColor = .lightGray view.addSubview(q10Label) if (q10Label.text?.contains("■"))! { q10Label.backgroundColor = .cyan } if (q10Label.text?.characters.count)! > 22 { q10Label.numberOfLines = 0 q10Label.sizeToFit() q10Label.frame.size.height += 21 q10Label.frame = CGRect(x: 20, y: q10Y, width: 335, height: q10Label.frame.size.height) } } } コード

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

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

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

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

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

guest

回答2

0

UILabelは配列には入れられないのでしょうか?

入れられますよ。

swift

1var labels = [UILabel]() 2for _ in 0..<10 { 3 labels.append(UILabel()) 4}

投稿2018/01/18 03:48

fuzzball

総合スコア16731

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

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

torkia

2018/01/18 07:40

ご回答ありがとうございます。上記のコードではエラーがでたので、上記のコードを参考にして       var labels = [UILabel]() labels.append(q1Label)    ・    ・ (略)    ・ labels.append(q10Label) for i in labels { if (i.text?.contains("■"))! { i.backgroundColor = .yellow } としてみました。ここからが本題で、特定の文字列が入っているラベルを取得したいのですが、.containsでやると(true/falseしか返さない)、指示通り色を変更してくれますが、その該当するラベルの取り出し方が分からなくて苦戦しています。教えて頂ければ嬉しいです。
fuzzball

2018/01/18 07:51

こちらではエラーは出ていませんが(Swift3/4)、どういうエラーが出ているのでしょうか? 「該当するラベル」というのは何でしょうか? 上記コードの i ではなくて?
torkia

2018/01/18 08:42

ご回答ありがとうございます。エラーといいますか、こちらの勉強不足で申し訳ないのですが、その後のコード(文字列を含むかどうかのコード)を入れるとRunできなくて・・・ 教えて頂いたコードの続きの書き方わかりませんでした。labelsのprint出力をしても1~10のラベルが確認できませんでした。 「該当するラベル」とは特定の文字列を含むラベルが「q9Label」だったとしたら、そのラベルの「q9Label」を取り出したいです。iでprint出力すると1~10までのLabelがすべて出力され、true/falseがわかるようになっているだけで、trueになっている特定の文字列が含まれるラベルを取得する方法がわかりません。
fuzzball

2018/01/18 08:58

> iでprint出力すると1~10までのLabelがすべて出力され それはprintをif文の外に書いているからではないですか? ■が含まれている → if文の中に入る → 背景を黄色にする、という流れなのですから、■を含むラベルを表示したいのであれば、if文の中にprintを書いて下さい。
torkia

2018/01/18 10:21

ご回答ありがとうございます。 ご指摘通りprint文をif文の外に書いてました。if文の中にprint文を書いてiを出力させると該当するラベルのみのテキスト内容はわかるのですが、if文の外でその i(例えばq9Label)を使いたいのですがどうやったらいいのかが分かりません。
fuzzball

2018/01/18 10:30

「外」がどこなのか分かりませんが、保存しておいて、「外」で取り出せばいいです。
torkia

2018/01/18 13:48

ご回答ありがとうございます。意味がわからないのですが、保存とは?  if文の中に let q: UILabel = i などとしておいて if文の外で print("q: (q)") や let qrY = q.frame.origin.y + q.frame.size.height としてみたのですがエラーがでます。
fuzzball

2018/01/18 14:31 編集

let q: UILabel = i が、まさに「保存」です。q に i を保存しています。 if文の中に let q: UILabel = i と書くと、if文の中でしか q を参照できません。q はif文の外で宣言して下さい。 ちなみに、そのif文の外でやろうとしている処理は、if文の中で出来ないですか?それが出来るのなら保存する必要は無いのですが。
torkia

2018/01/19 02:18

ご回答ありがとうございます。if文の外に let q :UILabel = i としても i にエラーがでてしまいます。 >if文の中で出来ないですか? その方向でやり方を考え直してみます。ありがとうございました。
guest

0

自己解決

ラベルをfor_in文で量産させて、その後if文で特定の文字列を含むラベルに、処理をさせるようにした。

for index in 0..<31 { let label = UILabel() label.frame = CGRect(x: X, y: Y + (H * index), width: W, height: H) label.font = UIFont.systemFont(ofSize: 15) label.textColor = black label.backgroundColor = LightGray label.text = dayArray[6 + (4 * index)] labels.append(label) scrollView.addSubview(label) } // ■が含まれていれば、 ■を削除してラベルの色を変える for index in 0..<labels.count { if let range = labels[index].text?.range(of: "■") { labels[index].text?.removeSubrange(range) labels[index].backgroundColor = rgbaMediumGray print("■を含むラベル: (labels[index])") } }

投稿2018/07/17 16:01

torkia

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問