我有一个表,它将SQL中的数据填充到TableCells中。当我单击一个单元格时,我希望将仅该特定单元格的数据传递给另一个UIViewController。数据包括字符串。我该怎么办?
答案 0 :(得分:1)
让以后的搜索者更容易获得此答案-
开始场景-
Table View Controller (嵌入在UINavigationController中)-这是打开应用程序时看到的第一个ViewController,我们希望他将数据传输到我们的Destination View Controller
目标视图控制器-选择单元格后将到达的ViewController。
您可以在以下GIF中看到我已经从TableViewCell到Destination View Controller设置了一个序列,该序列的标识符为toDestination
(拖动时看不到蓝线 >?按住 ctrl )
这就是情节提要场景的样子-
(不要忘记设置单元的重用标识符,以便以后在代码中使用它)
在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
}
}
完整代码:
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
....
}