[英]I can't load data from delegate swift
我正在使用委托将通过JSON收集的数据传递给几个UIViewControllers
。
我以编程方式在MainViewController
内为ContainedViewController
创建了容器:
func createContainer(){
let controller: UIViewController = (storyboard?.instantiateViewControllerWithIdentifier("containedVC"))! as UIViewController
controller.view.frame = CGRect(x: 20, y: self.view.frame.height-220, width: self.view.frame.width-40, height: 200)
view.addSubview(controller.view)
self.addChildViewController(controller)
}
我在另一个类上使用JSON收集了一些数据( 然后将它们首先传递到MainViewController上 )并将它们传递给MainViewController
之后,调用了该函数。 我用于此目的的代码是:
func setForecast(forecast: Forecast) {
self.delegateForecast?.loadOnContained(forecast)
print("did forecast pass to delegate?")
createContainer()
}
我还在MainViewController
上设置了一个协议 :
protocol dataForContainedDelegate{
func loadOnContained(forecast: Forecast)
}
和一个变量 :
var delegateForecast: dataForContainedDelegate?
我的containedVC
代码是:
import UIKit
class ContainedViewController: UIViewController, UIPageViewControllerDataSource, dataForContainedDelegate {
var forecastService = MainViewController()
var pageViewController: UIPageViewController!
var pageDates: NSArray!
var pageHighTemps: NSArray!
var pageLowTemps: NSArray!
var pageDescriptions: NSArray!
//var pageImages: NSArray!
func loadOnContained(forecast: Forecast) {
print("forecast loaded")
self.pageDates = forecast.dates
print("dates set")
self.pageHighTemps = forecast.highTemps
self.pageLowTemps = forecast.lowTemps
self.pageDescriptions = forecast.descriptionsArray
createVCs()
}
func createVCs(){
self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController
self.pageViewController.dataSource = self
let startVC = self.viewControllerAtIndex(0) as ContentViewController
let viewControllers = NSArray(object: startVC)
self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil)
self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
self.addChildViewController(self.pageViewController)
self.view.addSubview(self.pageViewController.view)
self.pageViewController.didMoveToParentViewController(self)
}
override func viewDidLoad() {
super.viewDidLoad()
self.forecastService.delegateForecast = self
print("contained load")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func viewControllerAtIndex(index: Int) -> ContentViewController{
if(self.pageDates.count == 0) || (index >= self.pageDates.count){ //MARK2: ---ERRON IN THIS LINE "fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)
return ContentViewController()
}
let vc: ContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ContentViewController") as! ContentViewController
vc.pageIndex = index
vc.dateText = self.pageDates[index] as! String
vc.highTmp = self.pageHighTemps[index] as! String
vc.lowTmp = self.pageLowTemps[index] as! String
vc.descText = self.pageDescriptions[index] as! String
//vc.weatherFile = self.pageImages[index] as! String
return vc
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let vc = viewController as! ContentViewController
var index = vc.pageIndex as Int
if (index == 0 || index == NSNotFound){
return nil
}
index--
return self.viewControllerAtIndex(index)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
let vc = viewController as! ContentViewController
var index = vc.pageIndex as Int
if (index == NSNotFound){
return nil
}
index++
if (index == self.pageDates.count){
return nil
}
return self.viewControllerAtIndex(index)
}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return self.pageDates.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return 0
}
}
在我的输出窗口中,没有关于“预加载”或“日期设置”的任何信息,但是有“包含的负载”(在viewDidLoad
函数下):
self.weatherService.delegate = self **** at main
from DefaultsSet: Los Angeles
Weather Service class city: Los Angeles
Date: 21 Feb 2016 , High: 20.6 °C , Low: 10.0 °C, Text: Clear
Date: 22 Feb 2016 , High: 28.3 °C , Low: 12.8 °C, Text: Sunny
Date: 23 Feb 2016 , High: 27.8 °C , Low: 12.2 °C, Text: Partly Cloudy
Set Weather main view
did forecast pass to delegate?
contained load
混乱背后的原因
我想要当用户按下Set City按钮时能够选择一个城市,然后从JSON数据解析到MainViewController
( 当前条件 )和containedVC
的PageViewController
( 接下来几天的Forecast )中的PageViewController
上。
所以我的想法是
WeatherService
并将所有数据传递到MainViewController
MainViewController
setWeather
函数上,我们在MainViewController
设置标签 setForecast
上FUNC MainViewController
我们传递数据给containedVC
和动态创建页面。 但是似乎数据永远不会到达containedVC
。 有什么原因吗?
此外,如果我将其设置为WeatherServiceDelegate
并在viewDidLoad上调用setWeather(city: String)
则可以将数据加载到containedVC
,但是这样,我必须再次设置城市,并且不能在按下Set City
按钮时自动加载数据。
调用委托的时间,实际上没有设置委托(即委托为nil)。
据我了解,您只需要将数据从父viewController传递给子对象,就可以通过变量而不是使用委托将数据传递给子对象,如下所示,
func createContainer(){
let controller: UIViewController = (storyboard?.instantiateViewControllerWithIdentifier("containedVC"))! as UIViewController
controller.data = forecast // like this
controller.view.frame = CGRect(x: 20, y: self.view.frame.height-220, width: self.view.frame.width-40, height: 200)
view.addSubview(controller.view)
self.addChildViewController(controller)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.