【问题标题】:Xcode 8 Table View Cells to Different ViewsXcode 8 表格视图单元格到不同的视图
【发布时间】:2017-12-08 13:59:57
【问题描述】:

我在将 view controllers 链接到表视图 cells 时遇到问题。基本上,我的Table View 中有 4 个cells,我希望每个单元格在单击时都指向present 一个单独的view controller

这是我的快速代码:

import UIKit

var orchard = ["Dog", "Cat", "Bird", "Fish"]
var myIndex = 0

class AnimalList: UITableViewController {

    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return orchard.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        cell.textLabel?.text = orchard[indexPath.row]

        return cell
    }


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
        myIndex = indexPath.row
        performSegue(withIdentifier: "segue", sender: self)
    }
}

这是我的故事板,如您所见,我有 4 个 view controllers 想要连接到 4 个 table view cellsstoryboard

PS:我的table view controller 已经嵌入到navigation controller 中。

我该怎么做?谢谢!

【问题讨论】:

    标签: ios iphone xcode uitableview


    【解决方案1】:
    1. 将您的 TableViewController 嵌入到 Navigation Controller 中(很可能,您已经这样做了)。

    1. 选择黄色标记TableViewController点击Right Mouse按住并放到视图控制器,释放并选择Manual Segue -> Show

    1. 现在选择 segue 并将其重命名为唯一标识符。对于每个视图控制器,重复第 2 步和第 3 步。

    2. 更新tableView didSelectRowAt委托函数,如下所示。

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { performSegue(withIdentifier: orchard[indexPath.row], sender: self) }

    【讨论】:

    • 感谢您提供如此详细的教程,效果很好!
    • 很高兴听到,它帮助了你:) @Qin
    【解决方案2】:

    刚才我按照您的要求完成了演示项目,它运行良好。

    步骤1:准备你的故事板,如下图所示。

    步骤 2:将故事板标识符作为 dogID、catID、birdID、fishID 提供给相应的 viewController,如下图所示。 step3:在拱形数组的下方声明一个具有上述标识符的数组。

    var storyboardIds = ["dogID","catID","birdID","fishID"]
    

    第四步:修改你的 didSelectRowAt 方法,如下面代码 sn-p 所示。

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
        myIndex = indexPath.row
    
        if let vc = storyboard?.instantiateViewController(withIdentifier: storyboardIds[myIndex]) {
    
            self.navigationController?.pushViewController(vc, animated: true)
        }
    }
    

    【讨论】:

      【解决方案3】:

      为这四个ViewControllers 提供一个segue 并将其命名为vc1Seguevc2Seguevc3Seguevc3Segue

      并像下面这样更改您的 didSelectRowAt 方法

      override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
      {
          myIndex = indexPath.row
          switch myIndex {
                case 0:
                   performSegue(withIdentifier: "vc1Segue", sender: self)
                case 1:
                   performSegue(withIdentifier: "vc2Segue", sender: self)
                case 2:
                   performSegue(withIdentifier: "vc3Segue", sender: self)
                case 3:
                   performSegue(withIdentifier: "vc4Segue", sender: self)
              default:
                  print("Index greater than vcs")
              }
      }
      

      【讨论】:

        【解决方案4】:

        你能做的就是在你的

        override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
        {
            myIndex = indexPath.row
            performSegue(withIdentifier: "segue", sender: self)
        }
        

        func你可以检查它是哪个index,并根据你想要的presentviewController

        override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
        {
            myIndex = indexPath.row
            if let animal = orchard[indexPath.row] as String? {
                if animal == "dog" {
                    performSegue(withIdentifier: "dogViewController", sender: self)
                }
            }
        }
        

        在您的storyboard 中,您将创建一个从viewController 到所有viewControllerssegue,并使用dogViewController 等命名segues。

        【讨论】:

          【解决方案5】:

          通过 ctrl+右键单击并从表格视图控制器拖动到每个视图控制器,为 4 个视图控制器中的每一个创建一个 segue。给segues一个标识符(例如“TableToViewController1”、“TableToViewController2”等)

          然后在您的didSelectRowAt 中执行以下操作:

          var segueIdentifier = ""
          
          switch(indexPath.row) {
          case 0: // first cell is selected
              segueIdentifier = "TableToViewController1"
          case 1:
              segueIdentifier = "TableToViewController2"
          case 2:
              segueIdentifier = "TableToViewController3"
          case 3:
              segueIdentifier = "TableToViewController4"
          }
          
          performSegue(withIdentifier: segueIdentifier, sender: self)
          

          【讨论】: