在视图控制器之间传递数据而没有 segues
Posted
技术标签:
【中文标题】在视图控制器之间传递数据而没有 segues【英文标题】:Pass data between viewcontroller with out segues 【发布时间】:2020-06-29 09:16:17 【问题描述】:我能够在没有任何故事板的情况下以编程方式从一个ViewController
移动到另一个,现在是我需要传输数据的部分,在我的rootViewController
中,我有这种形式的数据:
var restaurants:[Restaurant] = [
Restaurant(name: "Cafe Deadend", image: "cafedeadend.jpg", isVisited: false),
Restaurant(name: "Homei", image: "homei.jpg", isVisited: false) ]
当然Restaurant
是我的模型部分中的一个类....
现在在我的根控制器中,我像这样移动到另一个控制器......
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
let detailView: DetailViewController = DetailViewController()
detailView.restaurant = restaurants[indexPath.row]
self.navigationController?.pushViewController(DetailViewController(), animated: false)
当然在我的DetailViewController
我有这个
var restaurant = Restaurant()
但是在这里,当我尝试在DetailViewController
中显示这样的图像时,期望图像名称与RestaurantViewController
中的代码一起出现我得到 nil....
let imageHeader = UIImageView(frame: CGRect(x: 0, y: 0, width: 400, height: 400))
imageHeader.image = UIImage(named: self.restaurant.image)
我总是得到图像的 nil 值,我应该得到图像的字符串名称,谁能指导我哪里出错了,为什么值没有从一个控制器转移到另一个控制器。
【问题讨论】:
这能回答你的问题吗? Passing Data between View Controllersvar restaurant = Restaurant()
将覆盖您之前使用detailView.restaurant = restaurants[indexPath.row]
设置的餐厅。
您在哪里创建了 DetailViewController 中的var restaurant = Restaurant()
? DetailViewController
是以编程方式创建的还是使用故事板创建的?
它是一个单独的类 .swift 文件,以编程方式,谢谢
【参考方案1】:
您的代码在您的didSelectRowAt
中有问题,因为您没有将先前创建的DetailViewController
传递给餐厅,而是另一个新创建的DetailViewController
,试试这个:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
let detailView: DetailViewController = DetailViewController()
detailView.restaurant = restaurants[indexPath.row]
self.navigationController?.pushViewController(detailView, animated: false)
看到pushViewController
方法的变化了吗?应该这样做。
【讨论】:
【参考方案2】:func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
let storyboard = UIStoryboard(name: "Main", bundle: nil) // change storyboard name here..
let detailView = storyboard.instantiateViewController(withIdentifier:
"DetailViewController") as! DetailViewController // check View controller identifier
detailView.restaurant = restaurants[indexPath.row]
navigationController?.pushViewController(detailView, animated: true)
【讨论】:
以上是关于在视图控制器之间传递数据而没有 segues的主要内容,如果未能解决你的问题,请参考以下文章
如何在视图控制器之间传递数据而不在 ios 中使用 segue?
使用 IBAction 将数据传递到另一个视图控制器而无需 segue swift
在视图控制器之间传递 iOS 10 Segue 中的数据 [重复]