在视图控制器之间传递数据而没有 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 Controllers var 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

通过 segue 在视图控制器之间传递数据

在视图控制器之间传递 iOS 10 Segue 中的数据 [重复]

在视图控制器之间传递数据 - Storyboards segues

将数据传递到 UITableView