

初めまして、XcodeでtableViewを用いてセルを複数個表示させることができました。  
そしてセルごとに画面の遷移先を変えたいと考えています。  
Navigation Controllerを用いてセルをタップすると画面が変わる所までは出来ましたが、どのセルを選んでも同じ画面に遷移してしまいます。

ここから、セルごとに画面の遷移先を変えるにはどのようにしたら良いのでしょうか。

viewControllerには以下のようなプログラムを書いております。

[code]

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
    
        @IBOutlet weak var tableView: UITableView!
    
        let math: [String] = ["数学I", "数学A", "数学II", "数学B", "数学Ⅲ", "数学C"]
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return math.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "beginnerCell", for: indexPath)
            cell.textLabel!.text = math[indexPath.row]
            return cell
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    }
    
[/code]


CC BY-SA 4.0
2018-05-12T01:59:54.357
43928
2018-05-13T07:59:41.873
2018-05-13T07:59:41.873
-1
28493
question
swift ios xcode uitableview
tableviewcellでセルごとに遷移先の画面を変える


> セルごとに画面の遷移先を変えるにはどのようにしたら良いのでしょうか。

各セルがタップされると、UITableViewDelegate Protocol の以下のメソッドが呼ばれます。

[code]

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    }
    
[/code]

そして、どのセルがタップされたかは、引数の`indexPath`によって判別することができるので、それによって処理を分岐させます。

以下が具体的なコード例になります。

[code]

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        switch indexPath.row {
        case 0:
            // 数学Iのセルタップ時処理
            // 以下はセグエで数学Iの画面遷移する場合の例
            self.performSegue(withIdentifier: "toMath1View", sender: nil)
        case 1:
            // 数学Aのセルタップ時
            ...(上記同様に数学Aの画面に遷移する処理)
        case 2:
            // 数学IIのセルタップ時
            ...(上記同様に数学IIの画面に遷移する処理)
        case 3:
            // 数学Bのセルタップ時
            ...(上記同様に数学Bの画面に遷移する処理)
        case 4:
            // 数学IIIのセルタップ時
            ...(上記同様に数学IIIの画面に遷移する処理)
        case 5:
            // 数学Cのセルタップ時
            ...(上記同様に数学Cの画面に遷移する処理)
        }
    }
    
[/code]

また、`case 0`のように直接的な値を書くのはコードの保守性などをを考えるとよろしくないので、以下のような`enum`を定義すると良いと思います。

[code]

        /// 数学の科目
    ///
    /// - math1: 数学I
    /// - mathA: 数学A
    /// - math2: 数学II
    /// - mathB: 数学B
    /// - math3: 数学III
    /// - mathC: 数学C
    enum MathCourse: Int {
        case math1 = 0
        case mathA
        case math2
        case mathB
        case math3
        case mathC
    
        /// 遷移先セグエIdentifier
        var seugeIdentifier: String {
            switch self {
            case .math1:
                return "toMath1"
            case .mathA:
                return "toMathA"
            case .math2:
                return "toMath2"
            case .mathB:
                return "toMathB"
            case .math3:
                return "toMath3"
            case .mathC:
                return "toMathC"
            }
        }
    
[/code]

それを以下のように使います。

[code]

    switch indexPath.row {
    case MathCourse.math1:
        // 数学Iのセルタップ時処理
        // 以下はセグエで数学Iの画面遷移する場合の例
        self.performSegue(withIdentifier: MathCourse.math1.seugeIdentifier, sender: nil)
    case MathCourse.mathA:
        ・・・
    
[/code]


CC BY-SA 4.0
2018-05-13T06:13:39.593
43953
2018-05-13T06:13:39.593
28506
43928
answer