繁体   English   中英

我无法从委托swift加载数据

[英]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当前条件 )和containedVCPageViewController接下来几天的Forecast )中的PageViewController上。

所以我的想法是

  1. 用户设置城市
  2. 调用WeatherService并将所有数据传递到MainViewController
  3. MainViewController setWeather函数上,我们在MainViewController设置标签
  4. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM