Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我只能加载一次viewcontroller吗?_Ios_Swift_Segue_Navigationcontroller_Pass Data - Fatal编程技术网

Ios 我只能加载一次viewcontroller吗?

Ios 我只能加载一次viewcontroller吗?,ios,swift,segue,navigationcontroller,pass-data,Ios,Swift,Segue,Navigationcontroller,Pass Data,我用城市列表做了一个表格视图。当我选择一个城市单元时,它将传递城市名称,并在故事板中使用segue显示城市的天气预报。但是,每次它似乎都会创建一个新的viewcontroller。但我不想这样。我希望它只能加载一次。对于用户来说,当他们没有互联网时,他们仍然可以看到数据,我为他们制作了一个按钮来刷新数据。 这是我的密码: override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

我用城市列表做了一个表格视图。当我选择一个城市单元时,它将传递城市名称,并在故事板中使用segue显示城市的天气预报。但是,每次它似乎都会创建一个新的viewcontroller。但我不想这样。我希望它只能加载一次。对于用户来说,当他们没有互联网时,他们仍然可以看到数据,我为他们制作了一个按钮来刷新数据。 这是我的密码:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        performSegue(withIdentifier: "showCurrentWeather", sender: nil)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showCurrentWeather"{
        let dvc = segue.destination as? WeatherViewController
        let selectedIndexPath = self.tableView.indexPathForSelectedRow
        if let selectedRow = selectedIndexPath?.row{
            dvc?.infoFromViewOne=cityName[selectedRow]

        }
    }
我尝试使用导航控制器来推动viewcontroller

   weatherViewController=self.storyboard?.instantiateViewController(withIdentifier: "weatherViewController") as! UIViewController

self.navigationController?.pushViewController(weatherViewController!, animated: true)
    @objc func backAction(){

    navigationController?.popViewController(animated: true)
}
在weatherViewController中,我定制了一个后退按钮来弹出视图控制器

   weatherViewController=self.storyboard?.instantiateViewController(withIdentifier: "weatherViewController") as! UIViewController

self.navigationController?.pushViewController(weatherViewController!, animated: true)
    @objc func backAction(){

    navigationController?.popViewController(animated: true)
}
但是,使用导航控制器时,我不知道如何将城市名称从所选单元格传递到天气视图控制器。
我怎样才能解决这个问题?谢谢

您需要将其转换为
!WeatherView控制器
不作为!UIViewController因为默认返回是可选的
UIViewController

weatherViewController = self.storyboard?.instantiateViewController(withIdentifier: "weatherViewController")    as! WeatherViewController
weatherViewController.infoFromViewOne = cityName[indexPath.row]
self.navigationController?.pushViewController(weatherViewController, animated: true)

另外,在VC不可见时将其保留在内存中不是一个好主意,您必须遵循create/deinit,因为它是

谢谢您回答我的问题,我以前尝试过,我将其转换为!WeatherViewcontroller,但它总是说“类型为'UIViewController'的值没有成员'infoFromViewOne'”在哪里声明WeatherViewcontroller???它可以声明为var weatherViewController:UIViewController!而它应该是var weatherViewController:weatherViewController!我声明为实例变量。我犯了一个小错误,但现在我可以从ViewOne中看到信息。但是,当我测试它时,当我再次按下手机时关闭互联网时,它仍然无法保留数据。更新:现在可以保留数据,但只有一个城市!按城市,显示城市,然后按其他城市B,C,D,。。。只给CityA看一次。是因为我的结构设计错误吗?