

SwiftでTableViewを使用した際に複数のTableViewCellの使い分けについてご教示お願いします。

イメージとしては、1つのTableでそこへ2つの異なったセルを表示させたいと思っております。  
雰囲気は、数回1つ目のセルを表示させ、とあるタイミングが来たら、2つ目の違うセルを追加表示し、また1つ目のセルを表示させ、最後に2つ目のセルを表示させたいと思っています。

UITable Viewを使用し、UITable View Cellを２つStoryBordに配置しました。配置したセルのTable View
CellのIdentifierをそれぞれ、tableCell、tableCell2としました。tableCellにはLabelを配置し、tableCell2にはText
Fieldを配置しました。  
[![StoryBord](https://i.stack.imgur.com/4BfyO.png)](https://i.stack.imgur.com/4BfyO.png)

[code]

    import UIKit
    
    class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    @IBOutlet var table:UITableView!
    
    let testString: NSArray = ["Sunday", "Monday", "Tueseday"]
    let testString2: NSArray = ["Wednesday", "Thursday", "Friday", "Saturday"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    //Table Viewのセルの数を指定
    func tableView(_ table: UITableView, numberOfRowsInSection section: Int) -> Int {
    
        return testString.count
    }
    
    //各セルの要素を設定する
    func tableView(_ table: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cellName: String
    
         cellName = "tableCell"
    
        let cell = table.dequeueReusableCell(withIdentifier: cellName, for: indexPath)
    
        let label = table.viewWithTag(1) as! UILabel
    
        label.text = "\(testString[indexPath.row])"
    
        return cell
    
    
    }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    }
    
[/code]

上記のようにコードを書き、testStringの中身は表示させることが出来ました。  
しかし、色々試しましたがtableCell2を続けて表示させる方法がわかりません。さらに、tebleCell2に続けて表示させtableCellを表示させ再びtableCell2を表示させることが出来ませんでした。  
その辺りの書き方をご教示して頂けたらと思います。  
よろしくお願いいたします。


CC BY-SA 3.0
2017-05-27T18:22:10.700
35077
2023-07-26T02:03:15.490
2017-05-29T11:36:04.943
23403
23403
question
swift swift3 uitableview
SwiftでTableViewを使用した際のTableViewCellの使い分けについて


とりあえず`tableView(_ tableView: UITableView, cellForRowAt indexPath:
IndexPath)`でセルの種類を振り分けるといいと思います。

こんな感じになります。

[code]

    class ViewController: UIViewController, UITableViewDataSource {
    
        @IBOutlet weak var tableView: UITableView!
    
        let testString = ["Sunday", "Monday", "Tueseday", "Wednesday", "Thursday", "Friday", "Saturday"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.tableView.dataSource = self
        }
    
        // MARK: - UITableViewDataSource
    
        func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.testString.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            if indexPath.row < 3 || indexPath.row > 5 {
                let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell")!
                let label = cell.viewWithTag(1) as! UILabel
                label.text = "\(self.testString[indexPath.row])"
                return cell
            }
            let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell2")!
            let field = cell.viewWithTag(2) as! UITextField
            field.text = "\(self.testString[indexPath.row])"
            return cell       
        }
    
    
    }
    
[/code]

セルの形が複雑であったりもっと種類が多かったりした場合は`UITableViewCellのサブクラス`を作り設定処理はそのサブクラスの中で行うのが理想的です。  
`tableView(_ tableView: UITableView, cellForRowAt indexPath:
IndexPath)`ではどのサブクラスをインスタンス化するのかを選択します。

またどの文字列を表示するかの選択が複雑になる場合は現在の`indexPath`からどの文字列を選択するのかを選ぶメソッドに切り出すといいです。  
インターネット上から取ってきたりなどもっと複雑になる場合はこれもクラスを分けたほうがいいです。


CC BY-SA 3.0
2017-05-27T20:30:41.713
35078
2017-05-27T20:30:41.713
14222
35077
answer