🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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

解決済

1回答

946閲覧

Swift セルで苗字に紐づいて表示させたい

abv

総合スコア12

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グッド

0クリップ

投稿2020/11/25 05:19

編集2020/11/27 07:17

前提・実現したいこと

https://qiita.com/BMJr/items/ca7bcf76d36acbdef75e
上記のサイトの2つ目の方法で表示させるところまではできました。

さらに苗字の右側に
例えば、["東京","千葉","埼玉"] のようなデータを
苗字と紐づいて表示させるために
Swiftでどのように記述すればよいのかが知りたいです。
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Xcode 12.2
Swift 5.3.1

こんな感じでやりたくてコードは作ってみたもののうまくゆかない

Swift

1import UIKit 2 3class TableViewController: UITableViewController { 4 5 typealias MySectionRow = (mySection: String, myRow: Array<String>) 6 var mySectionRows = [MySectionRow]() 7 var selectedClass = "" 8 var selectedPerson = "" 9 10 var birthPlace = ["東京","千葉","埼玉","神奈川","茨城","山梨"] 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 mySectionRows.append(("3年A組",["井上","加藤","田中"])) 15 mySectionRows.append(("3年B組",["鈴木","吉田"])) 16 mySectionRows.append(("3年C組",["遠藤","佐藤","村田","山田"])) 17 } 18 19 override func numberOfSections(in tableView: UITableView) -> Int { 20 return mySectionRows.count 21 } 22 23 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 24 return mySectionRows[section].myRow.count 25 } 26 27 override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 28 return mySectionRows[section].mySection 29 } 30 31 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 32 let cell = tableView.dequeueReusableCell(withIdentifier: "Reuse", for: indexPath) 33 34 let label1Text = cell.viewWithTag(1) as! UILabel 35 36 label1Text.text = mySectionRows[indexPath.section].myRow[indexPath.row] 37 38 let label2Text = cell.viewWithTag(2) as! UILabel 39 40 label2Text.text = birthPlace[indexPath.row] 41 42 return cell 43 } 44 45 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 46 selectedClass = mySectionRows[indexPath.section].mySection 47 selectedPerson = mySectionRows[indexPath.section].myRow[indexPath.row] 48 } 49 50} 51

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

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

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

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

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

TsukubaDepot

2020/11/26 11:50

> 例えば、["東京","千葉","埼玉"] のようなデータを > 苗字と紐づいて表示させるために どういう感じで紐づけたいと考えてらっしゃるのでしょうか。 いまいちイメージがつかめないので、具体的にどのように表示したいのか示していただければと思います。
abv

2020/11/27 00:23 編集

クラスのグループの中にある名前と出身地を同じセルに表示させたいです。 今までは、異なるクラスでも内容が同一のセルが固定された数だけ表示されていました。 ですが求めていることは、クラスごとにそれぞれのクラスの人数分だけ表示させることなので 探した結果、あのサイトにたどり着き、サンプルを参考に作成しましたら、最初の目的は達成しました。 次に求めていることは、1つのセルに名前と出身地2つを表示させることなので その方法を探してみましたが、見つけることができなかったため、質問させていただきました。
TsukubaDepot

2020/11/27 02:49

いただいたコメントの解釈はいくつかあるのですが、 1. データ構造として名前と出身地を関連づける方法がわからない 2. ひとつの UITableViewCell に複数のラベルを配置し、各ラベルに名前と出身地を表示したい のどちらになるのでしょうか。 ただ、1. が解決しないことには 2. は実現しませんので、そのあたりの理解度も明確にしていただければと思います。
abv

2020/11/27 04:37

1になります。 2については、既に2つのラベルを用意して、表示できる段階です。
TsukubaDepot

2020/11/27 04:52

そうなると、苗字と出身地をどのようにして紐づけたいのかわからない限り、回答するのは難しいと思います。 「こんな感じでやりたくてコードは作ってみたもののうまくゆかない」ということがわかれば、それに合わせて回答することは可能なのですが、ご提示いただくコードはありませんでしょうか。
abv

2020/11/27 07:21 編集

birthPlaceの配列データを mySectionRowsの配列1つにまとめて表示させたいのですが、 このようなコードでよろしいでしょうか?
TsukubaDepot

2020/11/27 07:36

ご提示、ありがとうございます。 方針が明確になりそうです。
guest

回答1

0

ベストアンサー

ご提示いただいた方法だと、名前と出身地との間に関連性が全くないため、

  • クラス出席番号1番は東京
  • クラス出席番号2番は千葉
  • ...

という具合に出席番号に応じて出身地が決まってしまいます。
実際のところ、出身地は名前と紐づいているため、名前と関連づけて管理する必要があります。

参考にされたページはタプル(tupple)を使ってデータを管理しているため、その方針で考えてみたいと思います。

まず、名前と出身地を管理するタプルを作ります。
参考にされているサイトでも、typeAlias を使っているので、それを使いたいと思います。

Swift

1 typealias NameAndBirthplace = (name: String, birthPlace: String)

さらに、mySectionRow を次のように書き換えます。

Swift

1 typealias MySectionRow = (mySection: String, myRow: Array<NameAndBirthplace>)

これで、myRow の部分は、NameAndBirtplace という型(実際は(name:String, birthPlace: String)のタプル)の Array として利用できるようになりました。

そうすると、次のような感じで名前と出身地を一括して登録することが可能となります。

Swift

1 mySectionRows.append(("3年A組",[("井上", "茨城"), ("加藤", "東京"), ("田中", "山梨")]))

タプルのラベル(namebirthPlace)は省略できますので、ここでは省略していますが、名前と出身地をセットにして管理することはご理解いただけるかと思います。

そうなると、あとは UITableViewCell への表示部分の変更となります。
その部分は

Swift

1 label1Text.text = mySectionRows[indexPath.section].myRow[indexPath.row].name 2 3 label2Text.text = mySectionRows[indexPath.section].myRow[indexPath.row].birthPlace

のような感じで、タプルのラベルでアクセスすることとなります。

ところで、これは現状のコードの変更をなるべく最小限に抑えるための方法であり、管理の仕方としては最適とは決して言い難いと思います。

ひとつは、出身地をすべて打ち込まなければいけませんが、この方法だと "茨城" を "茨木" と間違えたりする可能性もあります。

また、ラベルに値を代入する部分の見通しも良くありません。

これらを効率よく解決するとなると、たとえば列挙型を用いたり、あるいは構造体を使ってクラス管理をやることになると思いますが、それをやってしまうと理解が追いつかなくなる可能性がありますので、まずはタプルでどのように管理すれば良いのか整理されてから、次のステップに進まれるのも一つかと思います。

ちなみに、タプルは構造体やクラスを作るほどでもない、ごく簡単なデータ管理方法として使われますので、この方法が全くの誤りというわけではないかと思います(実際、ごく簡単なサンプルを作るときにはタプルは非常に便利に使えます)。

以下、書き換えたコード全文となります。

Swift

1import UIKit 2 3class TableViewController: UITableViewController { 4 5 typealias NameAndBirthplace = (name: String, birthPlace: String) 6 7 typealias MySectionRow = (mySection: String, myRow: Array<NameAndBirthplace>) 8 var mySectionRows = [MySectionRow]() 9 var selectedClass = "" 10 var selectedPerson = "" 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 mySectionRows.append(("3年A組",[("井上", "茨城"), ("加藤", "東京"), ("田中", "山梨")])) 15 mySectionRows.append(("3年B組",[("鈴木", "神奈川"), ("吉田", "埼玉")])) 16 mySectionRows.append(("3年C組",[("遠藤", "東京"), ("佐藤", "埼玉"), ("村田", "山梨"), ("山田", "茨城")])) 17 } 18 19 override func numberOfSections(in tableView: UITableView) -> Int { 20 return mySectionRows.count 21 } 22 23 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 24 return mySectionRows[section].myRow.count 25 } 26 27 override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 28 return mySectionRows[section].mySection 29 } 30 31 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 32 let cell = tableView.dequeueReusableCell(withIdentifier: "Reuse", for: indexPath) 33 34 let label1Text = cell.viewWithTag(1) as! UILabel 35 36 label1Text.text = mySectionRows[indexPath.section].myRow[indexPath.row].name 37 38 let label2Text = cell.viewWithTag(2) as! UILabel 39 40 label2Text.text = mySectionRows[indexPath.section].myRow[indexPath.row].birthPlace 41 42 return cell 43 } 44 45 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 46 selectedClass = mySectionRows[indexPath.section].mySection 47 // 48 selectedPerson = mySectionRows[indexPath.section].myRow[indexPath.row].name 49 } 50 51}

投稿2020/11/27 07:58

TsukubaDepot

総合スコア5086

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

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

abv

2020/11/30 00:43

ありがとうございます! とてもわかりやすい説明で助かります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問