首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个视图控制器更新视图控制器的内容而不打开它

从另一个视图控制器更新视图控制器的内容而不打开它
EN

Stack Overflow用户
提问于 2016-06-03 12:48:15
回答 2查看 2.2K关注 0票数 0

在我正在开发的应用程序中,当一个按钮被点击时,我需要更新2个视图控制器。我成功地更新了包含按钮的视图控制器,但无法更新其他视图控制器的内容。

我尝试了几种方法:首先,在按钮的视图控制器中创建了一个委托变量(使用协议),并将其值设置为另一个视图控制器:

代码语言:javascript
复制
var delegate: WeatherServiceDelegateForcast? = ViewController2()

由于ViewController2是视图控制器,所以我试图使用委托进行更新。

议定书:

代码语言:javascript
复制
protocol WeatherServiceDelegateForcast{
    func SetForcast(forcast: ForcastInfo)
}

SetForcast在viewController2中的作用

代码语言:javascript
复制
func SetForcast(forcast: ForcastInfo) {
    self.day1Label.text = ....
}

问题是,在执行函数SetForcast时,IBOutlet of day1label为0,因此不能更新。我认为这是因为视图控制器尚未加载,但我无法找到加载它的方法。

其次,我尝试使用segue (没有委托)将数据传递给viewcontroller2。这是可行的,但只有当我使用类型显示为segue和在我的应用程序,它是至关重要的,它不会打开。当我尝试使用segue而不打开viewcontroller2 (按类型自定义)时,它再次无法工作,也无法识别IBOutlets。

有什么建议吗?如何在不打开数据的情况下将数据传递给viewcontroller2?

编辑:

这是我使用的代码:

当点击viewcontroller1中的按钮时,它从textfield获取数据,并从其属性天气服务(可以工作)调用函数。

代码语言:javascript
复制
 self.weatherService.GetForcast(textField.text!)

GetWeather获取城市的天气,通过类型预测创建一个变量,然后:

代码语言:javascript
复制
if self.delegate2 != nil
        {
            dispatch_async(dispatch_get_main_queue(), {
                self.delegate2?.SetForecast(forecast)
            })
        }

因为delegate2是weatherService的属性,它引用了viewcontroller2,在weatherService类的开头是这样定义的:

代码语言:javascript
复制
var delegate2: WeatherServiceDelegateForecast? = ViewController2()

WeatherServiceForcast是协议:

代码语言:javascript
复制
protocol WeatherServiceDelegateForcast
{
    func SetForecast(forecast: ForecastInfo)
} 

然后,根据调试器,它使用正确的预测变量执行SetForecast of viewcontroller2:

代码语言:javascript
复制
func SetForcast(forcast: ForcastInfo) {
    self.day1 = String(round(forcast.day[0])) + "-" + String(round(forcast.night[0]))
    self.day2 = String(round(forcast.day[1])) + "-" + String(round(forcast.night[1]))
    self.day3 = String(round(forcast.day[2])) + "-" + String(round(forcast.night[2]))
    self.day4 = String(round(forcast.day[3])) + "-" + String(round(forcast.night[3]))
    self.day5 = String(round(forcast.day[4])) + "-" + String(round(forcast.night[4]))
    self.day6 = String(round(forcast.day[5])) + "-" + String(round(forcast.night[5]))
    self.day7 = String(round(forcast.day[6])) + "-" + String(round(forcast.night[6]))
}

由于day1-7是viewController2类中的变量,因此我想在以后更新viewController2的标签,这些变量是如何定义的:

代码语言:javascript
复制
var day1 = String()
var day2 = String()
var day3 = String()
var day4 = String()
var day5 = String()
var day6 = String()
var day7 = String()

在viewDidLoad中,我将代码放在变量d1-7的字符串中更新标签,但似乎它首先调用了该函数,然后才调用set预测和更新变量。

代码语言:javascript
复制
 override func viewDidLoad() {

    // Do any additional setup after loading the view.
    self.day1Label.text = self.day1
    self.day2Label.text = self.day2
    self.day3Label.text = self.day3
    self.day4Label.text = self.day4
    self.day5Label.text = self.day5
    self.day6Label.text = self.day6
    self.day7Label.text = self.day7

}
EN

回答 2

Stack Overflow用户

发布于 2016-06-03 13:14:30

为什么不在viewWillAppearviewDidLoad中更新您的viewDidLoad的内容呢?在需要在屏幕上显示视图和子视图之前,视图控制器不会加载视图和子视图。因此,如果不显示viewController2视图,就不会加载它,这就是为什么您获得了零并且无法访问它的原因。

要实现你想要的目标,一个干净的方法是:

  1. viewController2中有一个单独的属性来存储数据
  2. viewController1中设置属性的内容
  3. 然后根据刚才设置的属性更新viewController2viewDidLoadviewWillAppear中的视图。

编辑

试着改变这个:

代码语言:javascript
复制
if self.delegate2 != nil
        {
            dispatch_async(dispatch_get_main_queue(), {
                self.delegate2?.SetForecast(forecast)
            })
        }

代码语言:javascript
复制
if self.delegate2 != nil
    {
        self.delegate2?.SetForecast(forecast)

    }

异步块中的代码将异步执行,因此在设置viewWillAppearviewDidload属性之前,或可能被称为。这就是为什么这些值是"“。另外,这里不需要使用异步块,您在SetForcast中所做的只是设置属性值,它们几乎是立即完成的。

票数 1
EN

Stack Overflow用户

发布于 2016-06-03 12:56:18

你就是不能这么做。

如果没有加载ViewController2,它就不会--永远不会--获取数据。

你必须先初始化它,然后你可以给它数据,而不显示它。

您只需执行“alloc”就可以将其加载到变量中。你提供的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37614827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档