简体   繁体   English

我无法从委托swift加载数据

[英]I can't load data from delegate swift

I'm using delegates to pass data collected through JSON to several UIViewControllers . 我正在使用委托将通过JSON收集的数据传递给几个UIViewControllers

My setup is like this 我的设置是这样的

I create programaticaly the container for the ContainedViewController inside the MainViewController : 我以编程方式在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)
}

I call the function after I collect some data with JSON ( and pass them first on the MainViewController ) on another class and pass them to the MainViewController . 我在另一个类使用JSON收集了一些数据( 然后将它们首先传递到MainViewController上 )并将它们传递给MainViewController之后,调用了该函数。 The code I use for this purpose is: 我用于此目的的代码是:

func setForecast(forecast: Forecast) {
    self.delegateForecast?.loadOnContained(forecast)
    print("did forecast pass to delegate?")
    createContainer()
}

I've also set up a protocol on the MainViewController : 我还在MainViewController上设置了一个协议

protocol dataForContainedDelegate{
    func loadOnContained(forecast: Forecast)
}

And a variable : 和一个变量

var delegateForecast: dataForContainedDelegate?

My code for the containedVC is: 我的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
    }
}

When I run the app I get this screen 当我运行应用程序时,出现此屏幕

and on my output window there's nowhere anything about "forecast loaded" or "dates set", but there's "contained load" (which is under viewDidLoad func): 在我的输出窗口中,没有关于“预加载”或“日期设置”的任何信息,但是有“包含的负载”(在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

The reason behind this mess 混乱背后的原因

I want when the user press Set City button to be able to select a city and then the data from JSON to be parsed on the MainViewController ( Current Conditions ) and on the PageViewController inside the the containedVC ( Forecast for the following days ). 我想要当用户按下Set City按钮时能够选择一个城市,然后从JSON数据解析到MainViewController当前条件 )和containedVCPageViewController接下来几天的Forecast )中的PageViewController上。

So my thinking is 所以我的想法是

  1. User sets city 用户设置城市
  2. WeatherService is called and pass all the data to MainViewController 调用WeatherService并将所有数据传递到MainViewController
  3. On setWeather func on MainViewController we set the label on MainViewController MainViewController setWeather函数上,我们在MainViewController设置标签
  4. On setForecast func on MainViewController we pass data to the containedVC and create the pages dynamically. setForecast上FUNC MainViewController我们传递数据给containedVC和动态创建页面。

but it seems the data never arrive on the containedVC . 但是似乎数据永远不会到达containedVC Any reasons for that? 有什么原因吗?

Furthermore I can load data to containedVC if I make it a WeatherServiceDelegate and on viewDidLoad call setWeather(city: String) but this way I have to set the city again and not automatically load the data on Set City button pressed. 此外,如果我将其设置为WeatherServiceDelegate并在viewDidLoad上调用setWeather(city: String)则可以将数据加载到containedVC ,但是这样,我必须再次设置城市,并且不能在按下Set City按钮时自动加载数据。

The time at which you call the delegate, actually the delegate was not set(ie delegate is nil). 调用委托的时间,实际上没有设置委托(即委托为nil)。

From my understanding, you just need to pass the data from parent viewController to child for which you could just pass the data through a variable instead of using delegate, as shown below, 据我了解,您只需要将数据从父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