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

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

ただいまの
回答率

90.84%

  • Swift

    6484questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 202

torkia

score 14

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)
        }

    }

}

コード
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

入れられますよ。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/18 16:40

    ご回答ありがとうございます。上記のコードではエラーがでたので、上記のコードを参考にして      
    var labels = [UILabel]()

    labels.append(q1Label)
       ・
       ・
    (略)
       ・
    labels.append(q10Label)

    for i in labels {
    if (i.text?.contains("■"))! {
    i.backgroundColor = .yellow
    }
    としてみました。ここからが本題で、特定の文字列が入っているラベルを取得したいのですが、.containsでやると(true/falseしか返さない)、指示通り色を変更してくれますが、その該当するラベルの取り出し方が分からなくて苦戦しています。教えて頂ければ嬉しいです。

    キャンセル

  • 2018/01/18 16:51

    こちらではエラーは出ていませんが(Swift3/4)、どういうエラーが出ているのでしょうか?

    「該当するラベル」というのは何でしょうか?
    上記コードの i ではなくて?

    キャンセル

  • 2018/01/18 17:42

    ご回答ありがとうございます。エラーといいますか、こちらの勉強不足で申し訳ないのですが、その後のコード(文字列を含むかどうかのコード)を入れるとRunできなくて・・・ 教えて頂いたコードの続きの書き方わかりませんでした。labelsのprint出力をしても1~10のラベルが確認できませんでした。

    「該当するラベル」とは特定の文字列を含むラベルが「q9Label」だったとしたら、そのラベルの「q9Label」を取り出したいです。iでprint出力すると1~10までのLabelがすべて出力され、true/falseがわかるようになっているだけで、trueになっている特定の文字列が含まれるラベルを取得する方法がわかりません。

    キャンセル

  • 2018/01/18 17:58

    > iでprint出力すると1~10までのLabelがすべて出力され

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

    キャンセル

  • 2018/01/18 19:21

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

    キャンセル

  • 2018/01/18 19:30

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

    キャンセル

  • 2018/01/18 22:48

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

    キャンセル

  • 2018/01/18 23:09 編集

    let q: UILabel = i が、まさに「保存」です。q に i を保存しています。

    if文の中に let q: UILabel = i と書くと、if文の中でしか q を参照できません。q はif文の外で宣言して下さい。

    ちなみに、そのif文の外でやろうとしている処理は、if文の中で出来ないですか?それが出来るのなら保存する必要は無いのですが。

    キャンセル

  • 2018/01/19 11:18

    ご回答ありがとうございます。if文の外に let q :UILabel = i としても i にエラーがでてしまいます。

    >if文の中で出来ないですか?
    その方向でやり方を考え直してみます。ありがとうございました。

    キャンセル

check解決した方法

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])")
            }
        }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    6484questions

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