将数据从 TableView 发送到 DetailView Swift
Send data from TableView to DetailView Swift
到目前为止,我正在尝试做对我来说可能是最简单也最令人困惑的事情之一
我想开发我自己的应用程序,为了做到这一点,我需要能够根据用户点击的行传递一些信息(它是 Swift 语言)
我们有一个 RootViewController(table 视图)和一个 DetailViewController(带有 1 个标签和 1 个图像)
(我们的观点)
代码如下:
@IBOutlet weak var tableView: UITableView!
var vehicleData : [String] = ["Ferrari 458" , "Lamborghini Murcielago" , "Bugatti Veyron", "Mercedes Benz Biome"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var nib = UINib(nibName: "TableViewCell", bundle: nil)
tableView.registerNib(nib, forCellReuseIdentifier: "cell")
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return vehicleData.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:TableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as TableViewCell
cell.lblCarName.text = vehicleData[indexPath.row]
cell.imgCar.image = UIImage(named: vehicleData[indexPath.row])
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("DetailView", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "DetailView") {
var vc = segue.destinationViewController as DetailViewController
}
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 100
}
自定义 TableViewCell class(有一个带单元格的 xib 文件)
class TableViewCell: UITableViewCell {
@IBOutlet weak var lblCarName: UILabel!
@IBOutlet weak var imgCar: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
class DetailViewController: UIViewController {
@IBOutlet weak var lblDetail: UILabel!
@IBOutlet weak var imgDetail: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
问题是:
如果用户点击 Ferrari 458 ,DetailViewController 中的 lblDetail 会显示:Ferrari 458 is a super car which is able to reach 325 km/ h ...... (whatever we want)
并且 imgDetail 将能够显示汽车的图像(无论我们想要什么)
如果用户现在单击 Bugatti Veyron,lblDetail 会向我们显示:Bugatti Veyron 是一款完美的超级运动机器。它是世界上最快的汽车之一....
imgDetail 给我们看这辆车的图片
所有汽车都一样,这取决于我们点击了哪一行
我知道工作是围绕第一个 View Controller 中的 prepareForSegue func 进行的,但我尝试了很多不同的方法来实现它并且一切正常
我们如何做到这一点???
这是给你的例子:
var valueToPass:String!
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
println("You selected cell #\(indexPath.row)!")
// Get Cell Label
let indexPath = tableView.indexPathForSelectedRow!
let currentCell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell
valueToPass = currentCell.textLabel.text
performSegueWithIdentifier("yourSegueIdentifer", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
if (segue.identifier == "yourSegueIdentifer") {
// initialize new view controller and cast it as your view controller
var viewController = segue.destinationViewController as AnotherViewController
// your new view controller should have property that will store passed value
viewController.passedValue = valueToPass
}
}
但是不要忘记在 DetailViewController
中创建一个 passedValue
变量。
这只是将数据从一个 viewController 传递到另一个的示例,您可以根据需要使用此示例传递数据。
有关更多信息,请参阅此链接。
Passing values between ViewControllers based on list selection in Swift
Use didSelectRowAtIndexPath or prepareForSegue method for UITableView?
https://teamtreehouse.com/forum/help-swift-segue-with-variables-is-not-working
也许这会对你有所帮助。
Swift 3.0
var valueToPass:String!
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("You selected cell #\(indexPath.row)!")
// Get Cell Label
let indexPath = tableView.indexPathForSelectedRow!
let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
valueToPass = currentCell.textLabel?.text
performSegue(withIdentifier: "yourSegueIdentifer", sender: self)
}
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
if (segue.identifier == "yourSegueIdentifer") {
// initialize new view controller and cast it as your view controller
var viewController = segue.destination as! AnotherViewController
// your new view controller should have property that will store passed value
viewController.passedValue = valueToPass
}
}
很简单,我在上面的答案中添加了一个语句。
要在详细视图标签中获取选定的汽车名称,
lblDetail.text = 传递值
您可以在详细视图的 viewDidLoad() 函数中添加此行代码。 passedValue 包含用户选择的汽车名称(在 prepareForSegue 中分配)然后您可以分配给 detailedView 标签。
希望对您有所帮助!!
如果您将 segue 从原型单元格(在 Interface Builder 中)拖到下一个 View Controller 并将其 segue 标识符设置为 "Your Segue Identifier",您也可以使用此快捷方式来完成:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "Your Segue Identifier" {
let cell = sender as! YourCustomCell
let vc = segue.destination as! PushedViewController
vc.valueToPass = cell.textLabel?.text // or custom label
}
}
而且您也不需要 didSelectRowAtIndexPath()
中的 performSegueWithIdentifier()
,也不需要此 Table 查看方法。
在PushedViewController.swift
(下一个View Controller)中:
var valueToPass: String!
override func viewDidLoad() {
super.viewDidLoad()
yourLabel.text = valueToPass
}
在从故事板初始化之后设置标签的值很重要。也就是说,你不能直接在之前的View Controller的prepareForSegue()
中设置label,所以需要通过valueToPass
.
来传递
这可能是另一种解决方案,在 didSelectRowAtIndexPath 方法中没有太多代码。
请注意,虽然它看起来更干净,而且我们不需要额外的变量 valueToPass,但这可能不是最佳实践,因为 performSegue 方法中的 sender 参数应该是启动 segue(或 nil)的实际对象。
// MARK: UITableViewDelegate methods
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
performSegue(withIdentifier: "goToSecondVC", sender: indexPath)
}
// MARK: UIViewController methods
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToSecondVC" {
if segue.destination.isKind(of: CarDetailsController.self) {
let secondVC = segue.destination as! CarDetailsController
let indexPath = sender as! IndexPath
secondVC.passedValue = carsArray[indexPath.row]
}
}
}
到目前为止,我正在尝试做对我来说可能是最简单也最令人困惑的事情之一 我想开发我自己的应用程序,为了做到这一点,我需要能够根据用户点击的行传递一些信息(它是 Swift 语言)
我们有一个 RootViewController(table 视图)和一个 DetailViewController(带有 1 个标签和 1 个图像)
(我们的观点)
代码如下:
@IBOutlet weak var tableView: UITableView!
var vehicleData : [String] = ["Ferrari 458" , "Lamborghini Murcielago" , "Bugatti Veyron", "Mercedes Benz Biome"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var nib = UINib(nibName: "TableViewCell", bundle: nil)
tableView.registerNib(nib, forCellReuseIdentifier: "cell")
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return vehicleData.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:TableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as TableViewCell
cell.lblCarName.text = vehicleData[indexPath.row]
cell.imgCar.image = UIImage(named: vehicleData[indexPath.row])
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("DetailView", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "DetailView") {
var vc = segue.destinationViewController as DetailViewController
}
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 100
}
自定义 TableViewCell class(有一个带单元格的 xib 文件)
class TableViewCell: UITableViewCell {
@IBOutlet weak var lblCarName: UILabel!
@IBOutlet weak var imgCar: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
class DetailViewController: UIViewController {
@IBOutlet weak var lblDetail: UILabel!
@IBOutlet weak var imgDetail: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
问题是:
如果用户点击 Ferrari 458 ,DetailViewController 中的 lblDetail 会显示:Ferrari 458 is a super car which is able to reach 325 km/ h ...... (whatever we want) 并且 imgDetail 将能够显示汽车的图像(无论我们想要什么)
如果用户现在单击 Bugatti Veyron,lblDetail 会向我们显示:Bugatti Veyron 是一款完美的超级运动机器。它是世界上最快的汽车之一....
imgDetail 给我们看这辆车的图片
所有汽车都一样,这取决于我们点击了哪一行
我知道工作是围绕第一个 View Controller 中的 prepareForSegue func 进行的,但我尝试了很多不同的方法来实现它并且一切正常
我们如何做到这一点???
这是给你的例子:
var valueToPass:String!
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
println("You selected cell #\(indexPath.row)!")
// Get Cell Label
let indexPath = tableView.indexPathForSelectedRow!
let currentCell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell
valueToPass = currentCell.textLabel.text
performSegueWithIdentifier("yourSegueIdentifer", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
if (segue.identifier == "yourSegueIdentifer") {
// initialize new view controller and cast it as your view controller
var viewController = segue.destinationViewController as AnotherViewController
// your new view controller should have property that will store passed value
viewController.passedValue = valueToPass
}
}
但是不要忘记在 DetailViewController
中创建一个 passedValue
变量。
这只是将数据从一个 viewController 传递到另一个的示例,您可以根据需要使用此示例传递数据。
有关更多信息,请参阅此链接。
Passing values between ViewControllers based on list selection in Swift
Use didSelectRowAtIndexPath or prepareForSegue method for UITableView?
https://teamtreehouse.com/forum/help-swift-segue-with-variables-is-not-working
也许这会对你有所帮助。
Swift 3.0
var valueToPass:String!
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("You selected cell #\(indexPath.row)!")
// Get Cell Label
let indexPath = tableView.indexPathForSelectedRow!
let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
valueToPass = currentCell.textLabel?.text
performSegue(withIdentifier: "yourSegueIdentifer", sender: self)
}
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
if (segue.identifier == "yourSegueIdentifer") {
// initialize new view controller and cast it as your view controller
var viewController = segue.destination as! AnotherViewController
// your new view controller should have property that will store passed value
viewController.passedValue = valueToPass
}
}
很简单,我在上面的答案中添加了一个语句。 要在详细视图标签中获取选定的汽车名称,
lblDetail.text = 传递值
您可以在详细视图的 viewDidLoad() 函数中添加此行代码。 passedValue 包含用户选择的汽车名称(在 prepareForSegue 中分配)然后您可以分配给 detailedView 标签。
希望对您有所帮助!!
如果您将 segue 从原型单元格(在 Interface Builder 中)拖到下一个 View Controller 并将其 segue 标识符设置为 "Your Segue Identifier",您也可以使用此快捷方式来完成:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "Your Segue Identifier" {
let cell = sender as! YourCustomCell
let vc = segue.destination as! PushedViewController
vc.valueToPass = cell.textLabel?.text // or custom label
}
}
而且您也不需要 didSelectRowAtIndexPath()
中的 performSegueWithIdentifier()
,也不需要此 Table 查看方法。
在PushedViewController.swift
(下一个View Controller)中:
var valueToPass: String!
override func viewDidLoad() {
super.viewDidLoad()
yourLabel.text = valueToPass
}
在从故事板初始化之后设置标签的值很重要。也就是说,你不能直接在之前的View Controller的prepareForSegue()
中设置label,所以需要通过valueToPass
.
这可能是另一种解决方案,在 didSelectRowAtIndexPath 方法中没有太多代码。 请注意,虽然它看起来更干净,而且我们不需要额外的变量 valueToPass,但这可能不是最佳实践,因为 performSegue 方法中的 sender 参数应该是启动 segue(或 nil)的实际对象。
// MARK: UITableViewDelegate methods
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
performSegue(withIdentifier: "goToSecondVC", sender: indexPath)
}
// MARK: UIViewController methods
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToSecondVC" {
if segue.destination.isKind(of: CarDetailsController.self) {
let secondVC = segue.destination as! CarDetailsController
let indexPath = sender as! IndexPath
secondVC.passedValue = carsArray[indexPath.row]
}
}
}