在我正在开发的应用程序中,当一个按钮被点击时,我需要更新2个视图控制器。我成功地更新了包含按钮的视图控制器,但无法更新其他视图控制器的内容。
我尝试了几种方法:首先,在按钮的视图控制器中创建了一个委托变量(使用协议),并将其值设置为另一个视图控制器:
var delegate: WeatherServiceDelegateForcast? = ViewController2()由于ViewController2是视图控制器,所以我试图使用委托进行更新。
议定书:
protocol WeatherServiceDelegateForcast{
func SetForcast(forcast: ForcastInfo)
}SetForcast在viewController2中的作用
func SetForcast(forcast: ForcastInfo) {
self.day1Label.text = ....
}问题是,在执行函数SetForcast时,IBOutlet of day1label为0,因此不能更新。我认为这是因为视图控制器尚未加载,但我无法找到加载它的方法。
其次,我尝试使用segue (没有委托)将数据传递给viewcontroller2。这是可行的,但只有当我使用类型显示为segue和在我的应用程序,它是至关重要的,它不会打开。当我尝试使用segue而不打开viewcontroller2 (按类型自定义)时,它再次无法工作,也无法识别IBOutlets。
有什么建议吗?如何在不打开数据的情况下将数据传递给viewcontroller2?
编辑:
这是我使用的代码:
当点击viewcontroller1中的按钮时,它从textfield获取数据,并从其属性天气服务(可以工作)调用函数。
self.weatherService.GetForcast(textField.text!)GetWeather获取城市的天气,通过类型预测创建一个变量,然后:
if self.delegate2 != nil
{
dispatch_async(dispatch_get_main_queue(), {
self.delegate2?.SetForecast(forecast)
})
}因为delegate2是weatherService的属性,它引用了viewcontroller2,在weatherService类的开头是这样定义的:
var delegate2: WeatherServiceDelegateForecast? = ViewController2()WeatherServiceForcast是协议:
protocol WeatherServiceDelegateForcast
{
func SetForecast(forecast: ForecastInfo)
} 然后,根据调试器,它使用正确的预测变量执行SetForecast of viewcontroller2:
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的标签,这些变量是如何定义的:
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预测和更新变量。
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
}发布于 2016-06-03 13:14:30
为什么不在viewWillAppear或viewDidLoad中更新您的viewDidLoad的内容呢?在需要在屏幕上显示视图和子视图之前,视图控制器不会加载视图和子视图。因此,如果不显示viewController2视图,就不会加载它,这就是为什么您获得了零并且无法访问它的原因。
要实现你想要的目标,一个干净的方法是:
viewController2中有一个单独的属性来存储数据viewController1中设置属性的内容viewController2在viewDidLoad或viewWillAppear中的视图。编辑
试着改变这个:
if self.delegate2 != nil
{
dispatch_async(dispatch_get_main_queue(), {
self.delegate2?.SetForecast(forecast)
})
}至
if self.delegate2 != nil
{
self.delegate2?.SetForecast(forecast)
}异步块中的代码将异步执行,因此在设置viewWillAppear或viewDidload属性之前,或可能被称为。这就是为什么这些值是"“。另外,这里不需要使用异步块,您在SetForcast中所做的只是设置属性值,它们几乎是立即完成的。
发布于 2016-06-03 12:56:18
你就是不能这么做。
如果没有加载ViewController2,它就不会--永远不会--获取数据。
你必须先初始化它,然后你可以给它数据,而不显示它。
您只需执行“alloc”就可以将其加载到变量中。你提供的数据。
https://stackoverflow.com/questions/37614827
复制相似问题