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

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

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

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

Q&A

解決済

2回答

453閲覧

swift3で、配列の要素の有無でラベルの表示・非表示を設定したい。

torkia

総合スコア24

Swift

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

0グッド

0クリップ

投稿2017/11/08 05:03

配列の要素をラベルに表示させたいのですが、配列の各行の要素数が同じ数ではないので、要素数に応じた表示にしたいのですが、やり方が分からず、とりあえずviewDidLoad内にラベルを全て(一番多い数)表示させています。そうすると、少ない要素数の配列の行を呼んだ場合、テキスト表示のないラベルも表示されるので、これを何とかしたいのですが・・・。

ラベルの生成はStoryboardで、ラベルの色付けもしてあります。
テーブルビューのセルからindex番号を渡して、csvファイルから読み込んだテキストを表示させています。

この場合は、ラベルの生成はコード入力した方がよろしいのでしょうか?
コード入力でラベルを生成した場合のやり方も知りたいです。

汚いコードですが、どうぞよろしくお願い致します。

xcode8 swift3 で作成しています。

import UIKit class ViewController: UIViewController {   @IBOutlet weak var dayLabel: UILabel! @IBOutlet weak var categoryLabel: UILabel! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var questionLabel: UILabel! @IBOutlet weak var q1Label: UILabel! @IBOutlet weak var q2Label: UILabel! @IBOutlet weak var q3Label: UILabel! @IBOutlet weak var q4Label: UILabel! @IBOutlet weak var q5Label: UILabel! @IBOutlet weak var q6Label: UILabel! @IBOutlet weak var q7Label: UILabel! @IBOutlet weak var q8Label: UILabel! @IBOutlet weak var q9Label: UILabel! @IBOutlet weak var q10Label: UILabel! //シーン移動の際に設定されるデータ var received:Int? //csvArrayから取り出した問題を格納する配列dayArray var dayArray:[String] = [] override func viewDidLoad() { super.viewDidLoad() //CSVファイル名を引数にしてloadCSVメソッドを使用し、CSVファイルを読み込む     let csvArray = loadCSV("time") //csvArrayの行をタップされた番号で取得 dayArray = csvArray[received!].components(separatedBy: ";")        //ラベルにテキストを設定 dayLabel.text = dayArray[0] categoryLabel.text = dayArray[1] titleLabel.text = dayArray[2] questionLabel.text = dayArray[3] q1Label.text = dayArray[5] q2Label.text = dayArray[7] q3Label.text = dayArray[9] q4Label.text = dayArray[11] q5Label.text = dayArray[13] q6Label.text = dayArray[15] q7Label.text = dayArray[17] q8Label.text = dayArray[19] q9Label.text = dayArray[21] q10Label.text = dayArray[23] } (略) コード

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

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

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

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

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

MasakiHori

2017/11/08 08:06

「少ない要素数の配列の行を呼んだ場合」とありますが、お示しのコードは要素が少ない場合クラッシュします。要素は規定数あるが、内容が空文字列("")であるということでしょうか?
torkia

2017/11/08 09:50

追記ありがとうございます。q1Label〜q10Labelまでに問題文を表示させているのですが、問題が10問だったり7問だったりとバラバラで、それぞれ表示はできるのですが、余分なラベルまで表示されるので、「テキスト表示のないラベルは非表示にさせたい」ということなのですが・・・。配列の中身はcsvファイルから内容を取得していて、空文字列(" ")のようなものは作成しておりません。
guest

回答2

0

自己解決

csvファイルの作成をOpenOffice(フリーソフト)で作成しているのですが、csvファイルの行末を見ると「フィールドの区切り記号」に設定した記号が、一番多い要素数の行に合わせて他の行(要素数が少ない行)にも既成されてました。その行末の記号群が空文字列として扱われていたようです。
<例>
あ;;;;
か;き;く;;
さ;し;す;せ;そ //一番多い数の要素数

なので、ラベルはfor_in文で量産して配列labelsに入れてif文で空文字列の表示を不可にしました。

for index in 0..<31 { //最大要素数分のラベルを生成 let label = UILabel() (略) label.text = dayArray[6 + (4 * index)] labels.append(label) scrollView.addSubview(label) } // 空文字列が入ったラベルは表示させない for index in 0..<labels.count { if labels[index].text == "" { labels[index].isHidden = true } }

もしくは、行末の空文字列(フィールドの区切り記号の群)を消せば、行末に自動的に既成された空文字列は認識されなくなります。
そうすると各配列の要素数でラベルを量産してその数だけラベルを表示させられます。

for index in 0..<((dayArray.count - 5) / 4) { //各配列の要素数でラベルを生成 let label = UILabel() (略) label.text = dayArray[6 + (4 * index)] labels.append(label) scrollView.addSubview(label) }

記号群を消す方法は
● csvファイルをswiftに読み込んだ後でそのファイルをクリックして表示させ、直接消す。
● csvファイルをテキストエディット(Mac付属のソフト)などで開きなおして行末の記号群を消してからswiftに取り込む。(↑OpenOfficeで作成した場合しかわかりませんが)
※OpenOfficeの方でcsv保存するときに行末にフィールドの区切り記号の群を既成させない方法は分かりません。 なので、使用するcsvファイルの内容(行数やファイル数)が多い場合は記号群を消す方が大変かもしれません。保存時に既成させない方法がわかればいいのですが・・・。

投稿2018/07/17 14:32

編集2018/07/18 05:16
torkia

総合スコア24

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

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

fuzzball

2018/07/18 03:51

>>タブ区切りの記号が一番多いタブ数の行に合わせて... csvってそういうものですよ。 非表示にするのではなく、そもそも生成しなければいいと思うのですが?
torkia

2018/07/18 05:47

ご回答ありがとうございます。 回答欄に不足していた説明文とコードを追加致しました。 >>そもそも生成しなければいいと思うのですが? 全くその通りで、はじめからその方法を模索しておりましたが、なかなか解決策が浮かばず・・・ csvファイルの仕様自体を分かっていなかったのと、既成された記号群をもてあましておりました。 とりあえず、最適な方法かどうか分かりませんが、 既成された記号群を後で手動で消す方法で解決と致しました。 ご指摘ありがとうございました。参考になりました。
guest

0

10個程度であれば、現在のやり方でも許容範囲かなと思います。
表示させたくないラベルは非表示にすればいいです。
label.isHidden = true

投稿2017/11/10 05:25

fuzzball

総合スコア16731

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

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

torkia

2018/07/17 14:12 編集

ご回答ありがとうございます。 別ページのテーブルビューのセルから値をもらって配列の行を呼び出しているのですが、問題数の数が一定でないのと、数が20〜30ぐらいの時もあり、各々 label.isHiddenの設定をすると大変なので、if文などを使って、値の有無によって表示・非表示させたいのですが・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問