在 viewcontroller 之间传递数据而没有 segues

Pass data between viewcontroller with out segues

我能够在没有任何故事板的情况下以编程方式从一个 ViewController 移动到另一个,现在是我需要传输数据的部分,在我的 rootViewController 中,我有数据形式:

var restaurants:[Restaurant] = [
          Restaurant(name: "Cafe Deadend",  image: "cafedeadend.jpg", isVisited: false),
          Restaurant(name: "Homei", image: "homei.jpg", isVisited: false) ]

当然 Restaurant 是我模型部分中的 class ....

现在在我的根控制器中,我像这样移动到我的另一个控制器......

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 值,我应该在其中得到图像的字符串名称,任何人都可以指导我在哪里出错以及为什么值没有从一个控制器传输到另一个控制器。

您的代码在您的 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 方法的变化了吗?这应该可以做到。

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)

}