TableCell数据传递给另一个UIViewController

时间:2018-11-29 11:31:54

标签: sql swift uitableview

我有一个表,它将SQL中的数据填充到TableCells中。当我单击一个单元格时,我希望将该特定单元格的数据传递给另一个UIViewController。数据包括字符串。我该怎么办?

2 个答案:

答案 0 :(得分:1)

让以后的搜索者更容易获得此答案-

在UITableViewController和UIViewController之间传输数据

方法1-使用情节提要(较少的代码)

开始场景-

Table View Controller (嵌入在UINavigationController中)-这是打开应用程序时看到的第一个ViewController,我们希望他将数据传输到我们的Destination View Controller

目标视图控制器-选择单元格后将到达的ViewController。

您可以在以下GIF中看到我已经从TableViewCell到Destination View Controller设置了一个序列,该序列的标识符为toDestination(拖动时看不到蓝线 >?按住 ctrl

Setting up segue

这就是情节提要场景的样子-

(不要忘记设置单元的重用标识符,以便以后在代码中使用它)

starting scene 现在让我们深入研究代码:

在TableViewController中,我们编写此函数:

// Here we're transfering the data we want to our DestinationViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let destinationVC = segue.destination as? DestinationViewController{

        if let pressedIndexPath = tableView.indexPathForSelectedRow{
            // passed string is just some variable I've declared on DestinationViewController
            destinationVC.passedString = dataHolder[pressedIndexPath.row]
        }
    }
}

您甚至什么时候调用了此函数?  我没有调用它,它是自动调用的,因为我已经使用情节提要板在单元格和DestinationViewController之间设置了一个序列(记住起始场景吗?...),现在每次用户按下该单元格时,序列都会自动启动这个函数被调用

我们的DestinationViewController端看起来像这样-

class DestinationViewController: UIViewController {

      @IBOutlet weak var label: UILabel!

      var passedString: String!

       override func viewDidLoad() {
          super.viewDidLoad()

          label.text = passedString
       }
}

我们完成了,这是最终结果 enter image description here

完整代码:

class TableViewController: UITableViewController {

   let dataHolder = ["string1", "string2", "string3", "string4"]

   override func numberOfSections(in tableView: UITableView) -> Int { return 1 }

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


   override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

       // change "cell" to your cell's reuse identifier
       let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

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

       return cell
   }

   // Here we're transfering the data we want to our DestinationViewController
   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

       if let destinationVC = segue.destination as? DestinationViewController{

           if let pressedIndexPath = tableView.indexPathForSelectedRow{

               destinationVC.passedString = dataHolder[pressedIndexPath.row]
           }
       }
    }
}

另一方面:

class DestinationViewController: UIViewController {

      @IBOutlet weak var label: UILabel!

      var passedString: String!

       override func viewDidLoad() {
          super.viewDidLoad()

          label.text = passedString
       }
}

答案 1 :(得分:0)

您可以创建一个这样的自定义单元格

class CustomCell: UITableViewCell {
    var yourData: CustomData? // You can put your data here as you want, you can also have three different variables for your data

    override func awakeFromNib() {
        // Initialization code
        super.awakeFromNib()
    }
}

之后在cellForRow函数中

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

    // Here you can set data of your cell as you want
    cell.yourData = // Put your data

    return cell
}

然后您可以使用didSelectRowAt

传递数据
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let selectedCell: CustomCell = tableView.cellForRow(at: indexPath)!
    let yourData = selectedCell.yourData
    // Here you can perform a segue or you can present a ViewController and pass your data
    ....
}