50749


[こちら](https://www.sejuku.net/blog/36626)を参考にTalbeViewControllerを配置しコネクトしたのですが、[![エラーがめん](https://i.stack.imgur.com/IYh2t.png)](https://i.stack.imgur.com/IYh2t.png)  
このように三つほどエラーが出てしまいこれ以上先に進めません  
コネクションを全て断つとStatic table views are only valid when embedded in
UITablelViewController
instancesというエラーを残しそれ以外は消滅するのですが、どうしても全てのエラーを消し切ることができません。  
ソースコードはこのようになっています。

[code]

    //
    //  yogo.swift
    //  Senkyo
    //
    //  Created by student on 2018/11/01.
    //  Copyright © 2018年 *****. All rights reserved.
    //
    import UIKit
    import Foundation
    class yogo: UIViewController,         UITableViewDelegate,     UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }
    @IBOutlet weak var UIView1: UIView!
    @IBOutlet weak var TableView: UITableView!
    @IBOutlet weak var Cell: UITableViewCell!
    var yougo : String = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        //var data :[String]
        //data = [""]
        // Do any additional setup after loading the view, typically from a nib.
        let csvBundle = Bundle.main.path(forResource: "用語解説", ofType: "csv")
        //CSVデータ読み込み
        var n :Int
        n = 0
        do {
            var csvData: String = try String(contentsOfFile: csvBundle!, encoding: String.Encoding.shiftJIS)
            csvData = csvData.replacingOccurrences(of: "\r", with: "")
            let csvArray :[String] = csvData.components(separatedBy: "@")
            let _:AppDelegate = UIApplication.shared.delegate as! AppDelegate //Appdelegateのインスタンスを取得
            //data[n] = csvArray[n]
            Cell.textLabel!.text = csvArray[n]
            n = n + 1
            }catch let error {
                //ファイル読み込みエラー時
                print(error)
        }
    }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    
[/code]

最終的に実現したいこととしては、Cellに用語一覧を表示し、クリックするとデータを読み込んでその解説を表示するというシステムを作りたいのですが、この状態だとビルドすることすらできないので困っています。もう二週間ほど未解決のままなので誰か解決方法をご教授お願いします。

Xcode 10, Swift4.2


CC BY-SA 4.0
2018-11-29T02:17:20.300
50735
2018-12-03T10:48:56.097
2018-11-29T03:06:50.360
31171
31171
question
xcode swift4 tableview
Static Cellの扱い方について、説明通りに操作したのにエラーが出てしまう


プロジェクトの中で、`ViewController`の継承クラスが`yogo.swift`になっていない気がします。

あと、一般的なCocoaでのルールですが、`Class`名や定数名は大文字ではじめ、変数やメソッド(`func`)名は小文字から始めた方がいいと思います。

  1. プロジェクトを開き、一番右のグレイ背景のペインで、上のフォルダーアイコンをクリックし、プロジェクトナビゲーターを表示し、`yogo.swift`を選び、`yogo.swift`のソースを表示させます
  2. `Xcode`ウィンドウの右上に○が二つ重なって、斜めの8の字になったボタンをクリックし、アシスタントエディターをソースの右横に表示します
  3. アシスタントエディターの最上部の<>の左に四角が4つ並んでいるボタンから、ストーリーボードを選択します。選択肢にない場合は、四角4つのボタンを押し、プロジェクトを選んだ状態で1度マウスのボタンから手を離し、<>の右をクリックして、プロジェクトの階層を辿っていくことで、ストーリーボードが選べます
  4. `Xcode`ウィンドウの一番右上端にある四角の右横に縦棒が入ったボタンをクリックし、インスペクターを表示します
  5. アシスタントエディターで、ストーリーボードの画面レイアウトとUI部品の階層が表示されていると思うので、黄色い丸の中が白い四角でくりぬかれた、`ViewController`をクリックして、選択された状態にします
  6. 上の状態で、インスペクターの一番上に、ファイルアイコン、丸の中にクエスチョンマーク、・・・・と並んでいる、丸にクエスチョンマークの右の`Identity Inspector`をクリックします
  7. `Custom Class`の欄に、`Class`の横のテキストボックスが`ViewController`になっていると思うので、yogoに打ち直します（yまで打てば、`yogo`が推測候補に出てくると思います

以上の操作で、アプリケーションの最初の画面の`ViewController`が`yogo`になったので、ソース`yogo.swift`の`@IBOutlet`の左、行番号の所の○が◯の中に●の蛇の目になるとおもいます。

この状態でもエラーが出たり、`@IBOutlet`の行が◯の際は、目的のインターフェース部品と`@IBOutlet`の行を繋ぎ直してみて下さい。

12/3追記

大事なことを見落としていました。申し訳ありません。  
`@IBOutlet weak var Cell:
UITableViewCell!`の行は間違いで、`UITableViewCell`は`Outlet`でもってはいけないのでエラーが出ています。  
`UITableViewCell`は、`UITableView`のユーザーから見える範囲からはみ出すと、再利用可能キューに追加され、セルの再描画が要求されたときに`UITableView`の
`dequeueReusableCell(withIdentifier: "配置したTableViewCellに自分が付けた名前", for:
indexPath)`という再利用可能なセルがあればキューの中から、なければ新規にセルを作成して返すメソッドを通じて取得しなければいけません。

この、セルに再描画が必要になったよという要求が`UITableViewDelegate`プロトコルの

[code]

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    
[/code]

というメソッドで、このメソッドを定義して、中で、再利用可能なセルを取得し、行番号を元に表示したい内容を決定し、それを取得したセルに設定（描画）して返してあげる必要があるのです。

このため、ソースにソースに対して行う処理は、  
1\. `@IBOutlet weak var Cell: UITableViewCell!`を削除  
1\. `tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCell`を定義する  
1\. その中で`TableView.dequeueReusableCell(withIdentifier: "SampleCell", for:
indexPath)`でcellを取得  
1\. cellに、IndexPathで示される行に応じた内容を(`cell.label?.text`に）セット）  
1\. `cell`を`return`

と言うことになります。

12/3 追記終わり

これは、`@IBOutlet`が宣言されているけれど、どのインターフェース部品とも接続されていないときは◯で、`@IBOutlet`がインターフェース部品と接続されているときは中に●が書かれた蛇の目で表示されるので、未接続の部品と変数のペアチェックに活用下さい。  
もっとも、Xcode
10から、アシスタントエディター（ソースエディターの右側のエディター）に対応する`storyboard`や`xib`が表示されないと`Outlet接続`されていても、◯で表示される様になった気がします


CC BY-SA 4.0
2018-11-29T08:04:55.203
50749
2018-12-03T10:48:56.097
2018-12-03T10:48:56.097
14745
14745
50735
answer