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

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

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

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

Swift

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

Q&A

解決済

1回答

3187閲覧

テーブルビューに2段のラベルを設けてテキストを表示する方法 5.25内容追加

Tomzy

総合スコア104

Xcode

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

Swift

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

0グッド

1クリップ

投稿2016/05/23 06:19

編集2016/05/25 07:56

###前提・実現したいこと
作りたい画面:
第1画面 TableView01
イメージ説明
第2画面 TableView02
イメージ説明

このコンテンツを効率よく入れたい。

###発生している問題
TableView01よりTableView02に遷移成功。TableView02を2段にするべく、リンク内容を参照して、CustomCell.swift, CustomCell.xib, Text.swiftのファイルを追加しましたら、TableView02の画面にテキストは現れましたが、

let

1
let f2 = Test(label1: "02", label2:"bob")

のごとく、label1とlabel2の項目内容をいちいち記載する必要があります。
項目数が100項目くらいありますので、

let texts00 = ["01:自動で始まり終わる", "02:途中で止める方法",

//中略

let subtexts08 = ["01:電話の設定",
"02:カレンダー設定",
"03:写真設定"]

のごとく、予め項目の表をつくり
exts00 からtexts08および subtexts00からsubtexts08を使って2枚目の表の1段目と2段目に表示する方法を教えてください。

###コード1
TableView02コードのエッセンス部分は下記のとおりです。

import

1

class TableView02: UIViewController, UITableViewDataSource, UITableViewDelegate{

@IBOutlet var TableView02: UITableView!

var selectedIndexPathInViewController: NSIndexPath!

let texts00 = ["01:自動で始まり終わる",
"02:途中で止める方法",
// 中略
"10:上記全動画の通し映写"]

let texts01 = ["01:電話番号で発信", "02:「連絡先」の登録", //中略 "06:上記全動画の通し映写"] // ????下記のサブタイトルをcellの2.段目に入れたい。 let subtexts00 = ["動画の基本的な見方", //中略 "元の画面に戻る方法"] var Tests:[Test] = [Test]() override func viewDidLoad() { super.viewDidLoad() self.setupFriends() TableView02.delegate = self TableView02.dataSource = self let nib = UINib(nibName: "CustomCell", bundle: nil) TableView02.registerNib(nib, forCellReuseIdentifier: "Cell") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func setupFriends() { let f1 = Test(label1: "01:自動で始まり終わる", label2:"動画の基本的な見方") let f2 = Test(label1: "02", label2:"bbb") let f3 = Test(label1: "03", label2:"cccccc") let f4 = Test(label1: "04", label2:"dddddddddd") let f5 = Test(label1: "05", label2:"eeeeeeeeeeeeee") let f6 = Test(label1: "06", label2:"ffffffffffffffffff") Tests.append(f1) Tests.append(f2) Tests.append(f3) Tests.append(f4) Tests.append(f5) Tests.append(f6) } func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int { return Tests.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? CustomCell //cell中身セット(引数 セル、indexPath) cell?.setCell(Tests[indexPath.row]) return cell!

}
}

###コード2

class CustomCell: UITableViewCell {

@IBOutlet weak var label1: UILabel! @IBOutlet weak var label2: UILabel! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func setCell(test :Test) { self.label1.text = test.label1 self.label2.text = test.label2 }

}
###コード3

class Test : NSObject{

var label1:String var label2:String init(label1:String,label2:String){ self.label1 = label1 self.label2 = label2 } }

###ご参考事項
iMac27 OS-X11.4 El Capitan
Xcode 7.3.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず

swift

1 func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int { 2 return texts00.count 3 } 4 5 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 6 var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? CustomCell 7 8 cell?.label1.text = texts00[indexPath.row] 9 cell?.label2.text = subtexts00[indexPath.row] 10 return cell! 11 }

とすれば、TestsやsetupFriends()を作らなくても、質問のTableView02画面のようにtexts00とsubtexts00の内容を表示することはできると思います。


さらに、selectedIndexPathInViewControllerにTableView01で選択したindexPathが格納されていて、それに対応するテキストをtexts00〜texts08の中から選択したいのであれば、

TableView02のプロパティに以下を追加し、

swift

1var texts : [[String]]! 2var subtexts : [[String]]!

viewDidLoad()で以下のようにtextsとsubtextsを初期化し、

swift

1texts = [texts00,texts01,texts02,texts03,texts04,texts05,texts06,texts07,texts08] 2subtexts = [subtexts00,subtexts01,subtexts02,subtexts03,subtexts04,subtexts05,subtexts06,subtexts07,subtexts08]

テーブル表示処理を以下のようにselectedIndexPathInViewControllerから選んだものを表示するようにすればよいと思います。

swift

1 func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int { 2 return texts[selectedIndexPathInViewController.row].count 3 } 4 5 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 6 var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? CustomCell 7 8 cell?.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row] 9 cell?.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row] 10 return cell! 11 }

投稿2016/05/25 12:43

TakeOne

総合スコア6299

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

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

Tomzy

2016/05/25 13:55

有難うございました。 最初の「とりあえず」のコーディングは、上手く機能してtexts00とsubtexts00の内容を表示されました。 selectedIndexPathInViewControllerと連動するように頂いたコーディングは、私が望んでいたそのものです。しかし、コーディングをしましたら下記の2つのエラーがでました。 111 冒頭の class TableView02: UIViewController, UITableViewDataSource, UITableViewDelegate{ のエラーメッセージ Type ‘TableView02’ does not conform to protocol ‘UITableVieDataSource 222 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { の行エラーメッセージ Definition conflicts with previous value なお、TableView02上でのfunc setupFriends() とTest関連のコードはCommentOutしました。また、CustomCell.swiftとCustomCell.swiftのファイルは、さきの質問に書いたコードのままとしていじっていません。 更に、さきに質問した時点でも発生していた奇妙な現象がありましたので、ご報告します。それは、第1画面をタップすると第2画面に遷移するのですが、一旦第2画面がでてから同じ画面が再度現れます。第2画面の戻るボタンをタップすると前の第2画面に戻るだけです。その第2画面の戻るボタンを押すと第1画面に戻ります。コードを見直したのですが、それが発生する原因は見つけることができませんでした。 上記ふたつのエラーの対応について考えてみましたが、私の知識の範囲を超えていますので、更にご教示頂ければありがたく思います。
TakeOne

2016/05/25 22:40

エラーメッセージの意味がわからない時は、そのメッセージをそのまま検索してみることをお勧めします。 同じエラーに遭遇して解決した人の情報が得られれば、そのエラーメッセージの意味が理解しやすくなります。 「Type ‘TableView02’ does not conform to protocol ‘UITableVieDataSource」のエラーは、後のエラーが原因でUITableViewDataSourceに必要な関数が全部ちゃんと定義できていないため発生するエラーです。問題は後の「Definition conflicts with previous value」のエラーの方ですが、私の環境では発生しません。このエラーは似たような関数で戻りの型が違うものが2つ定義されているような場合に発生しますが、誤ってcellForRowAtIndexPathのメソッドを2つ定義していたりしませんか?こういうエラーは、自分で見直しするか、エラーが発生しているコード全体を見せてもらうかしないとこちらではわかりません。 あと、今回の質問と関係なかったので指摘していませんでしたが、気になった点をついでに指摘しておくと、 var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? CustomCell は本当は let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell とした方がよいです。var/letの違いでなくforIndexPathパラメータ付きか否かの問題です。 前者はcellがnilになる可能性があり、nilの場合ここでcellを新規確保する処理を書く必要がありますが、後者はnilになる可能性がありません。これによりcellはオプショナル型ではなくなりますので、この後cellを使用する処理ではcell?とかcell!とか書く必要はなく全部cellと書けばよいです。 (参考) http://dev.classmethod.jp/smartphone/iphone/ios6-uitableview/ もう1点気になったのは、TableView02というクラス名と同じ名前でTableView02というプロパティ名のUITableViewが定義されていることです。ビルドエラーは発生していないのでswiftではプロパティ名とクラス名に同じ名前を使用しても明確に区別されてエラーにならないのかもしれませんが、人間が混乱すると思うので別の名前にした方がよさそうに思います。 いずれの指摘も「奇妙な現象」と言われているものとは関係ないと思います。「奇妙な現象」は、まずTableView01の画面遷移処理で二種類の画面遷移処理を同時に実行したりしていないか確認した方がよさそうに思います。
Tomzy

2016/05/26 05:20

ありがとうございました。ひとつひとつ潰していきます。結果はご報告します。コードの意味が完全にわからないまま、あちこちのコードをコピペしてやっている段階ですので、迷路が長くつづきます。しかし、大分分かってきたところもあるので、根気よく究明したいと思います。今後ともよろしくご指導ください。
Tomzy

2016/05/26 08:48

殆ど一日2つのエラー対策に費やしましたが解決しません。一旦、「とりあえず」のコードに戻したのですが昨夜は成功裏に表示していたのに同じ2つのエラーがでます。多分、storyboardなどもいじったので、そちらが原因していると思います。頭を冷やして、新規にプロジェクトをつくって出直します。
Tomzy

2016/05/28 06:12

プロジェクトを新規につくりましたら、 111 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { の行エラーは消えました。 222 しかし、class TableView02: UIViewController, UITableViewDataSource, UITableViewDelegate{ のエラーメッセージ Type ‘TableView02’ does not conform to protocol ‘UITableVieDataSource は消えません。 333 エラーの検索結果は何れもTableViewの3要件と思われ、何度も見直しましたが正しく書けていると思われます。 エラーが消えないので、ビルドできませんので「奇妙な現象」の出現はわかりません。 QQQ 他にチェックすべきところはありますか。
TakeOne

2016/05/28 08:07

「TableViewの3要件」という意味がわかりませんが、「does not conform to protocol ‘UITableViewDataSource'」のエラーは 「func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int」と 「func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell」 の2つの関数が定義されていない場合に出ます。 (参考) http://mirai-stereo.net/2014/11/07/swift-does-not-conform-to-protocol-uitableviewdatasource/ numberOfRowsInSectionの定義の方を忘れているということはないんですか? 回答で示した2つの関数をそのままコピペしてもエラーが出るんですか?
Tomzy

2016/05/29 06:40

アドバイスありがとうございました。その後下記の経緯でコードのエラーは消えました。あと、storyboardのエラーが残っていますので、精査します。 AAA } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { で上の } が外れていましたので、それを入れましたら、以前と同じエラーがでるようになりました。 BBB texts = [texts00,texts01,texts02,texts03,texts04,texts05,texts06,texts07,texts08] subtexts = [subtexts00,subtexts01,subtexts02,subtexts03,subtexts04,subtexts05,subtexts06,subtexts07,subtexts08] } の下の } が抜けていましたので、入れましたら上記AAAのエラーと冒頭部の class TableView02: UIViewController, UITableViewDataSource, UITableViewDelegate{ のエラーメッセージ Type ‘TableView02’ does not conform to protocol ‘UITableVieDataSource が消えました。 CCC 残っているのは、下記のようなエラーが4個でていますので、つなぎを一度外してつけてみます。 The delegate outlet from the UITableViews is invalid. Outlet cannot be connected to repeating content. また、ご報告します。
Tomzy

2016/05/29 07:37

111 outletのエラーは、storyboardで TableView01とTableView02のOutlets dataSourceとdelegateが結ばれていたのを外しましたら、エラーはなくなりビルドできました。 222 ビルド結果は第1画面のみ文字が表示されて、そのセルをタップすると第2画面に遷移しますが、まだ文字が表示されません。⇒この原因を精査します。 333 前にご報告した「奇妙な現象」(遷移画面が2度現れる)原因は下記のコードが重複して記載されていました。いずれかをCommentOutすると正常に遷移します。 いずれを用いた方がよいのでしょうか。 performSegueWithIdentifier("toTableView02", sender: self) および self.performSegueWithIdentifier("toTableView02", sender: indexPath) あちこちのサンプルコードを拝借するとこういうことになるのですね。
TakeOne

2016/05/29 08:29 編集

> いずれを用いた方がよいのでしょうか。 > performSegueWithIdentifier("toTableView02", sender: self) > および > self.performSegueWithIdentifier("toTableView02", sender: indexPath) 先頭の「self.」を省略したら暗黙的に「self.」が付与されていると考えますので、「performSegueWithIdentifier」は「self.performSegueWithIdentifier」と同じです。 senderのパラメータ指定がselfとindexPathで異なっていますが、このパラメータは、prepareForSegue()のsenderパラメータに引き継がれますので、prepareForSegue()でsenderを見ていなければどちらでも構いません。ただ、prepareForSegue()でどのような処理をしているのか知らないので正確なことはわかりませんが、おそらくTableView01でタップしたセルのindexPathをsenderパラメータに設定してprepareForSegue()に引き渡し、prepareForSegue()でsender(indexPath)を遷移先ViewController(TableView02)のselectedIndexPathInViewControllerに設定して、どのセルがタップされたか引き継いでいるんじゃないかと推測します。 サンプルコードを取り込む際にはその仕組みをちゃんと理解して組み込むことをお勧めします。
Tomzy

2016/05/31 05:49

ありがとうございました。その後の結果をご報告しますので、よろしくご指導ください。 AAA self.performSegueWithIdentifier("toTableView02", sender: indexPath) に修正しました。 BBB 第2画面に遷移したあと文字が表示されない原因は、 storyboardびOutletsでdataSourceがdelegate結ばれていないことかと思い、むすびました。 CCC しかし、ビルド結果第1画面は表示され、項目をタップすると、TableView02の下記のコード1行目でThread1: signalSIGABRTがでて止まり、下記のエラーメッセージがでました。 コード  ↓ ↓ ↓ let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell cell.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row] cell.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row] return cell エラー  ↓ ↓ ↓ 2016-05-31 14:24:28.911 Lesson03m[348 47:3909420] Unknown class _TtC9Lesson03m15TableView02Cell in Interface Builder file. Could not cast value of type 'UITableViewCell' (0x10b9f5540) to 'Lesson03m.CustomCell' (0x109b60da0). (lldb) 2016-05-31 14:24:28.911 Lesson03m[34847:3909420] Unknown class _TtC9Lesson03m15TableView02Cell in Interface Builder file. Could not cast value of type 'UITableViewCell' (0x10b9f5540) to 'Lesson03m.CustomCell' (0x109b60da0). (lldb) なお、CustomCell.swift ファイルのコードは下記のようにしてあります。 import UIKit class CustomCell: UITableViewCell { @IBOutlet weak var label1: UILabel! @IBOutlet weak var label2: UILabel! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func setCell(test :Test) { self.label1.text = test.label1 self.label2.text = test.label2 } } 上記のOutletsはCustomCell.xibとは結ばれていましたが、 再度結びビルドしました。結果は同じでした。 また、 Text.swift ファイルのコードは下記のとおりです。 import Foundation class Test : NSObject{ var label1:String var label2:String init(label1:String,label2:String){ self.label1 = label1 self.label2 = label2 } } QQQ どこが悪くてエラーがでたのでしょうか。
TakeOne

2016/05/31 15:57

エラーメッセージを見ただけの推測ですが、 「Unknown class _TtC9Lesson03m15TableView02Cell in Interface Builder file.」 というメッセージから、CustomCell.xibに定義しているセルのクラス名が「CustomCell」じゃなくて「_TtC9Lesson03m15TableView02Cell」という名前になっているんじゃないかと思いました。
Tomzy

2016/06/01 00:45

ありがとうございました。 CustomCell.swift と Custom.xib ファイルを削除して新規につくり直そうとしました。そこで気付いたのですが、上記にも掲載しましたように、コードの中に func setCell(test :Test) { self.label1.text = test.label1 self.label2.text = test.label2 } というのがありました。test というのは大分前に借りてきたコードサンプルの残滓かと思われます。つまりtest というのは、現時点では使っていません。ここではどういうコードにするべきか分かりませんので教えてください。 なお、現時点での TableView02.swift のコードは下記のとおりです。 import UIKit import iAd class TableView02: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet var tableView02: UITableView! var selectedIndexPathInViewController: NSIndexPath! let texts00 = ["01:自動で始まり終わる", "02:途中で止める方法", /////中略 "09:iPadの特殊事情", "10:上記全動画の通し映写"] let subtexts00 = ["動画の基本的な見方", /////中略 let subtexts08 = ["01:電話の設定", "02:カレンダー設定", "03:写真設定"] //var Tests:[Test] = [Test]() //teratail助言2追加 var texts : [[String]]! var subtexts : [[String]]! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // Prepare interstitial Ad UIViewController.prepareInterstitialAds() // Show iAd self.canDisplayBannerAds = true //self.setupFriends() texts = [texts00,texts01,texts02,texts03,texts04,texts05,texts06,texts07,texts08] subtexts = [subtexts00,subtexts01,subtexts02,subtexts03,subtexts04,subtexts05,subtexts06,subtexts07,subtexts08] } func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int { return texts[selectedIndexPathInViewController.row].count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { //teratailTake One さんのコメントアドバイスにより修正 //var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? CustomCell let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell cell.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row] cell.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row] return cell } }
TakeOne

2016/06/01 02:32 編集

> test というのは大分前に借りてきたコードサンプルの残滓かと思われます。つまりtest というのは、現時点では使っていません。ここではどういうコードにするべきか分かりませんので教えてください。 使ってないなら削除すればいいと思います。ついでにTest.swiftも削除すればすっきりすると思います。 あと、もともとの質問のコードには let nib = UINib(nibName: "CustomCell", bundle: nil) TableView02.registerNib(nib, forCellReuseIdentifier: "Cell") があったんですが、いつの間にか消えていますよね。これがないと、CustomCell.xibの読み込みができません。 もしこの行が消えているのに「Unknown class _TtC9Lesson03m15TableView02Cell in Interface Builder file.」というエラーが出ていたのであれば、xibファイルではなくてStoryboardの中のどこかに"Cell"というidをつけたセルがあって、それが使われてしまったのではないかということも考えられます。xibでカスタムセルを作るのであれば、Storyboardで自動生成された不要セルは、混乱するので削除してしまえばよいと思います。 ついでに言うと、StoryboardでdataSourceやdelegateが結ばれていないので結び直したとありましたが、もともとのソースコードには TableView02.delegate = self TableView02.dataSource = self と書かれてありました。 Storyboardで結んでもコードで設定してもどちらでもいいですが、おかしくなったのはやはり元々必要だったコードを消してしまった(たぶん作り直した時に復元しきれてない)ためです。
Tomzy

2016/06/01 02:59

ごていねいにご説明頂き、だんだんわかってきました。 外出から帰宅次第試してご報告します。ありがとうございました。
Tomzy

2016/06/01 07:05

その後の試行と結果は下記のとおりです。 まだ、解決していません。 111 storyboardのTableView02にcustom cellを設定していましたので、削除しました。 222 CustomCell.swift と CustomCell.xib を新規につくり、下記のコードを書きました。 また、CustomCell.xib IBOutletsで結びました。 import UIKit class CustomCell: UITableViewCell { @IBOutlet weak var label1: UILabel! @IBOutlet weak var label2: UILabel! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } } 333 TableView02 の texts = [texts00,texts01,texts02,texts03,texts04,texts05,texts06,texts07,texts08] subtexts = [subtexts00,subtexts01,subtexts02,subtexts03,subtexts04,subtexts05,subtexts06,subtexts07,subtexts08] の下に下記のコードを追加しました。 TableView02.delegate = self TableView02.dataSource = self let nib = UINib(nibName: "CustomCell", bundle: nil) TableView02.registerNib(nib, forCellReuseIdentifier: "Cell") 444 ビルドすると追加コードのところに3ヶ所に下記のエラーがでます。 type ‘TableView02’ has no member ‘delegate’ type ‘TableView02’ has no member ‘dataSource’ type ‘TableView02’ has no member ‘registerNib’ 555 エラーについて検索したり、delegateを完全克服するためのまとめ http://nukenuke.hatenablog.com/entry/2015/09/17/120749 を読んだりして解決を試みたのですが、どうしても解決しません。 恐縮ですがご教示ください。
TakeOne

2016/06/01 07:36

> ビルドすると追加コードのところに3ヶ所に下記のエラーがでます。 > type ‘TableView02’ has no member ‘delegate’ > type ‘TableView02’ has no member ‘dataSource’ > type ‘TableView02’ has no member ‘registerNib’ もともとテーブルビューのプロパティ名を @IBOutlet var TableView02: UITableView! と定義していたのをクラス名と混乱しないように @IBOutlet var tableView02: UITableView! と名前を変更したのですから、そのプロパティ名にアクセスする方の名前もtableView02に変更する必要があります。 tableView02.delegate = self tableView02.dataSource = self let nib = UINib(nibName: "CustomCell", bundle: nil) tableView02.registerNib(nib, forCellReuseIdentifier: "Cell") たぶん、今は見よう見まねでコードをコピペしているだけで、クラス名とかプロパティ名の意味もあいまいでイメージできてないのだと思います。 オブジェクト指向の考え方や用語の意味について、一度swiftの入門書等をじっくり読んで勉強することをお勧めします。
Tomzy

2016/06/01 09:16

TableView02をtableView02に変更したのを忘れていました。 修正してビルドしたら一旦はsignalSIGABRTエラーはでましたが、storyboardのいじりすぎを修正しましたら、意図した第2画面がでました。ありがとうございました。 おっしゃる通り勉強しなおしです。超入門書を気に入っていまして、毎晩読んでいます。 このプロジェクトは、これで終わりでなく、第2画面にタイトルを表示することや第3画面に遷移してURLに対応したWebViewを表示する難問があります。別のタイトルで質問をさせて頂きます。 長いことおつきあい下さりありがとうございました。
Tomzy

2016/06/10 03:22

teratail 02 二段目の1行がずれてブランクになる不具合について質問 お陰様で第1画面の行を選択してタップするとその行に関連した第2画面が現れます。 111 しかし、よく見るとすべての画面で第2画面の2行目がずれて最初の行がブランクになっています。 下記に第1画面と第2画面の2つの例を添付します。    222 そこで下記のとおりprint文を組み込んで指示の行番号を示そうとしたのですが、prinnt文が現れません。 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell cell.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row] //一段目のために選ばれた行番号をプリントする print("タップされた 1段用 インデックスパス:\(indexPath.row)") cell.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row] //二段目のために選ばれた行番号をプリントする print("タップされた 2段用 インデックスパス:\(indexPath.row)") return cell } 333 一方、二段目用の行番号indexPath.rowを1つ減らすため cell.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row - 1] とやりましたら、ビルドは成功しました。しかし、第1画面をタップした場合、下記のエラーでました。 Thread 1: EXC_BAD_INSTRUCTION (code=EXC_1386_ONVOP.subcode=0x0) 444 そこで、このエラー対策として結合を一旦削除してつなぎなおしましたら、エラーは 単なるsignalSIGABRTになりました。 更におかしいことに cell.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row + 1] にしましたら、最初の行の動画の見方では、2行目が4番目までブランクなり+2にしましたら逆に 3番目になりました。しかし、その他の行の電話とかカレンダーは、全てタップ時に Thread 1: EXC_BAD_INSTRUCTION (code=EXC_1386_ONVOP.subcode=0x0) になりました。 555 いずれにしても[indexPath.row - 1]はすべてエラーになります。 なお、直前で初期値をゼロにする方法も乏しい知識で試して見ましたがエラーになってしまいます。 ◎ 解決策をご教示ください。 なお、現状でのTableView02のコードは下記のとおりです。 また、 let texts01URL = ["https://vimeo.com/150759960”,は次のステップのコードです。 // TableView02.swift class TableView02: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet var tableView02: UITableView! var selectedIndexPathInViewController: NSIndexPath! let texts00 = ["01:自動で始まり終わる", "02:途中で止める方法", "03:再開する方法", "04:終了して元に戻る", //中略・・・] let texts01 = ["01:電話番号で発信", "02:「連絡先」の登録", "03:「よく使う項目」", "04:「履歴」の使い方", //中略・・・] let texts02 = ["01:いろいろな画面", "02:イベントの記入方法", "03:上記全動画の通し映写"] //中略・・・ "03:写真設定"] let subtexts00 = ["動画の基本的な見方", "", "", "元の画面に戻る方法", "", //中略・・・] let subtexts01 = ["「キーパッド」という数字盤を使う", "住所録を使って発信", "よく使う電話番号の登録", "掛けた記録、掛かった記録を使う", "数字入力やスピーカーの使い方", "電話の使い方"] let subtexts02 = ["年画面、月画面、日画面、週画面、イベント(予定)画面", "新規イベント、既存イベントの修正、削除", ""] //中略・・・ //teratail助言2追加 var texts : [[String]]! var subtexts : [[String]]! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // Prepare interstitial Ad UIViewController.prepareInterstitialAds() // Show iAd self.canDisplayBannerAds = true //self.setupFriends() texts = [texts00,texts01,texts02,texts03,texts04,texts05,texts06,texts07,texts08] subtexts = [subtexts00,subtexts01,subtexts02,subtexts03,subtexts04,subtexts05,subtexts06,subtexts07,subtexts08] tableView02.delegate = self tableView02.dataSource = self let nib = UINib(nibName: "CustomCell", bundle: nil) tableView02.registerNib(nib, forCellReuseIdentifier: "Cell") } func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int { return texts[selectedIndexPathInViewController.row].count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { //teratailTake One さんのコメントアドバイスにより修正 //var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? CustomCell let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell cell.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row] //一段目のために選ばれた行番号をプリントする print("タップされた 1段用 インデックスパス:\(indexPath.row)") cell.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row - 1] //二段目のために選ばれた行番号をプリントする print("タップされた 2段用 インデックスパス:\(indexPath.row)") return cell } } }
TakeOne

2016/06/10 08:58 編集

コメントの最後に示されたTableView02のコードをコピペして subtexts[selectedIndexPathInViewController.row][indexPath.row - 1] じゃなくて、もともとの subtexts[selectedIndexPathInViewController.row][indexPath.row] に戻したら、普通に表示されました。printも表示されました。 「indexPath.row - 1」にしたら、indexPath.rowが0の時に subtexts[-1]にアクセスすることになるので、エラーになるのは当たり前です。 +/-しないで「indexPath.row」でアクセスするのが正しいと思います。 このコメント欄に画像を添付したようですが、コメントに画像は埋め込めないのでどんな画面になっているのかわかりません。 画像やソースコードを含むコメントがある場合は、質問欄を編集して追加のコメントを記載し、コメント欄に「質問欄に追加のコメントを入れました」とコメントしてもらえばいいです。 また、ソースコードを質問欄に貼る場合は https://teratail.com/help/question-tips の「3-7. Markdownを利用しましょう」の機能を使って ソースコード全体を選択した状態で「</>」の「コード」ボタンを 押してもらうと、コードが読みやすくなって助かります。
Tomzy

2016/06/11 22:06

ありがとうございました。 こちらではまだ改善していません(1行目ブランク状態)。クリーン、シミュレーターのリセット、DeriveDataのProjectおよびModuleCodeの削除、Xcodeの再起動、Macの再起動をやっても状況は変わりません。 改めてトライのあと明日、詳しく編集画面でご報告します。
Tomzy

2016/06/13 07:46

新しい質問として投稿しました。よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問