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

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

ただいまの
回答率

90.48%

  • Swift

    7484questions

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

  • Xcode

    4218questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,311

Tomzy

score 91

前提・実現したいこと

作りたい画面:
第1画面 TableView01
イメージ説明
第2画面 TableView02
イメージ説明

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

発生している問題

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

``````  let f1 = Test(label1: "01:自動で始まり終わる", label2:"動画の基本的な見方")         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 UIKit

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 

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

とりあえず

func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int { 
        return texts00.count 
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
        var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? CustomCell

        cell?.label1.text = texts00[indexPath.row]
        cell?.label2.text = subtexts00[indexPath.row]
        return cell! 
    }


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


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

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

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


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

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


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

func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int { 
        return texts[selectedIndexPathInViewController.row].count 
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
        var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? CustomCell

        cell?.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row]
        cell?.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row]
        return cell! 
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/25 22: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画面に戻ります。コードを見直したのですが、それが発生する原因は見つけることができませんでした。


    上記ふたつのエラーの対応について考えてみましたが、私の知識の範囲を超えていますので、更にご教示頂ければありがたく思います。

    キャンセル

  • 2016/05/26 07: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の画面遷移処理で二種類の画面遷移処理を同時に実行したりしていないか確認した方がよさそうに思います。

    キャンセル

  • 2016/05/26 14:20

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

    キャンセル

  • 2016/05/26 17:48

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

    キャンセル

  • 2016/05/28 15: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
    他にチェックすべきところはありますか。

    キャンセル

  • 2016/05/28 17: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つの関数をそのままコピペしてもエラーが出るんですか?

    キャンセル

  • 2016/05/29 15: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.

    また、ご報告します。





    キャンセル

  • 2016/05/29 16:37

    111
    outletのエラーは、storyboardで TableView01とTableView02のOutlets dataSourceとdelegateが結ばれていたのを外しましたら、エラーはなくなりビルドできました。

    222
    ビルド結果は第1画面のみ文字が表示されて、そのセルをタップすると第2画面に遷移しますが、まだ文字が表示されません。⇒この原因を精査します。

    333
    前にご報告した「奇妙な現象」(遷移画面が2度現れる)原因は下記のコードが重複して記載されていました。いずれかをCommentOutすると正常に遷移します。
    いずれを用いた方がよいのでしょうか。

    performSegueWithIdentifier("toTableView02", sender: self)
    および
    self.performSegueWithIdentifier("toTableView02", sender: indexPath)

    あちこちのサンプルコードを拝借するとこういうことになるのですね。

    キャンセル

  • 2016/05/29 17:28 編集

    > いずれを用いた方がよいのでしょうか。
    > 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に設定して、どのセルがタップされたか引き継いでいるんじゃないかと推測します。
    サンプルコードを取り込む際にはその仕組みをちゃんと理解して組み込むことをお勧めします。

    キャンセル

  • 2016/05/31 14: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
    どこが悪くてエラーがでたのでしょうか。

    キャンセル

  • 2016/06/01 00:57

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

    キャンセル

  • 2016/06/01 09: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

    }



    }


    キャンセル

  • 2016/06/01 11:23 編集

    > 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で結んでもコードで設定してもどちらでもいいですが、おかしくなったのはやはり元々必要だったコードを消してしまった(たぶん作り直した時に復元しきれてない)ためです。

    キャンセル

  • 2016/06/01 11:59

    ごていねいにご説明頂き、だんだんわかってきました。

    外出から帰宅次第試してご報告します。ありがとうございました。

    キャンセル

  • 2016/06/01 16: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
    を読んだりして解決を試みたのですが、どうしても解決しません。
    恐縮ですがご教示ください。

    キャンセル

  • 2016/06/01 16: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の入門書等をじっくり読んで勉強することをお勧めします。

    キャンセル

  • 2016/06/01 18:16

    TableView02をtableView02に変更したのを忘れていました。
    修正してビルドしたら一旦はsignalSIGABRTエラーはでましたが、storyboardのいじりすぎを修正しましたら、意図した第2画面がでました。ありがとうございました。

    おっしゃる通り勉強しなおしです。超入門書を気に入っていまして、毎晩読んでいます。

    このプロジェクトは、これで終わりでなく、第2画面にタイトルを表示することや第3画面に遷移してURLに対応したWebViewを表示する難問があります。別のタイトルで質問をさせて頂きます。
    長いことおつきあい下さりありがとうございました。

    キャンセル

  • 2016/06/10 12: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
    }

    }
    }

    キャンセル

  • 2016/06/10 17:16 編集

    コメントの最後に示された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を利用しましょう」の機能を使って
    ソースコード全体を選択した状態で「</>」の「コード」ボタンを
    押してもらうと、コードが読みやすくなって助かります。

    キャンセル

  • 2016/06/12 07:06

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

    改めてトライのあと明日、詳しく編集画面でご報告します。

    キャンセル

  • 2016/06/13 16:46

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

    キャンセル

関連した質問

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

  • Swift

    7484questions

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

  • Xcode

    4218questions

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