无法将数据传递给第二个视图控制器

时间:2015-04-04 11:36:43

标签: xml swift viewcontroller

我在这里遇到了问题。 我想从xml文件中解析有关天气的文本,并将其发送到第二个View Controller中的标签。在第一步中我这样做:

var xml = SWXMLHash.parse(urlContent!)


        for elem in xml["data"]["weather"][0]["hourly"][self.indexOfTime]{
            self.chanceRain = (elem["chanceofrain"].element!.text!)

        }

        println(self.chanceRain)

(以上是使用SWXMLHash完成的)

运行后会打印出没有任何问题的值。所以下一步是创建第一个和第一个之间的连接。第二个视图控制器:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if(segue.identifier == "btnSubmitSegue"){

        var svc: viewTwo = segue.destinationViewController as viewTwo

        svc.datapassed = "hello " + chanceRain

    } }

运行之后,标签是"你好"。当我在没有你好的情况下运行它时,就像这样它不显示任何东西。它有点奇怪,因为变量chanceRain会在日志中打印,并且"你好"显示在标签中,但chanceRain不会

有人能帮助我吗?如果需要更多信息,请告诉我您需要查看哪些信息/代码。

顺便说一下,这不是所有的编码,但我确定在我发布的代码中出错了。

修改

以下是完整代码:

import UIKit
import SWXMLHash

class ViewController: UIViewController, UITableViewDelegate {

var cellContent = [""]
var indexOfTime = 0
var chanceRain = ""



@IBOutlet var cityInput: UITextField!

func enumerate(indexer: XMLIndexer) {
for child in indexer.children {
    NSLog(child.element!.name)
    enumerate(child)
}
}

@IBAction func button(sender: AnyObject) {

var url = NSURL(string:            "http://api.worldweatheronline.com/free/v2/weather.ashx?  key=ca89103dfe0a8b844a0a1e1249820&q=" +
      cityInput.text.stringByReplacingOccurrencesOfString(" ", withString: "- ") + "/" + cityInput.text.stringByReplacingOccurrencesOfString(" ", withString: "- ") + "/" + "&num_of_days=2&tp=3&format=xml")

let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in

var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding)

println(url)

  var xml = SWXMLHash.parse(urlContent!)


     for elem in xml["data"]["weather"][0]["hourly"][self.indexOfTime]{
        self.chanceRain = (elem["chanceofrain"].element!.text!)

        }

        println(self.chanceRain)


    })
    task.resume()

}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {


if(segue.identifier == "btnSubmitSegue"){


    var svc: viewTwo = segue.destinationViewController as viewTwo

    svc.datapassed = "hallo " + toString(chanceRain) //dit werkt, maar     chanceRain niet..?


  } }





override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

cellContent = ["01:00","04:00","07:00", "10:00", "13:00", "16:00", "19:00",    "22:00"]
}

  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

  return cellContent.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = UITableViewCell(style: UITableViewCellStyle.Default  , reuseIdentifier: "Cell")

cell.textLabel?.text = "\(cellContent[indexPath.row])"

return cell }

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){

 indexOfTime = indexPath.row



 }



override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
 }
}

1 个答案:

答案 0 :(得分:1)

您的代码似乎合理,但细节很重要。

要检查的一些事项:

chanceRain被宣布为弱者吗?如果是,那就是你的问题。摆脱弱限定词。

如果失败,请检查设置chanceRain变量的其他内容。您甚至可以向属性添加didSet方法,并在didSet方法中设置断点以查看其被调用的位置。

顺便说一句,您发布的用于解析XML的代码有点愚蠢:

for elem in xml["data"]["weather"][0]["hourly"][self.indexOfTime]
{
  self.chanceRain = (elem["chanceofrain"].element!.text!)
}

每次通过for循环,您都会将chanceRain中的值替换为新值。在循环结束时,chanceRain将包含最后一个值。如果您只想要最后一个值,请将其写入仅解析最后一个元素。否则,编写代码来增加机会,连接它们或任何合适的代码。

编辑:

听起来你不了解任务和循环。

想象一下这段代码

var result = String()
for (i in 1..10)
  result = "String \(i)\n"

println(result)

你会看到的是

  

字符串10

如果您想要所有字符串从1到10,您应该编写如下代码:

var result = String()
for (i in 1..10)
  result = result + "String \(i)\n"

println(result)

在这种情况下,你会看到

  

字符串1
  字符串2
  字符串3
  字符串4
  字符串5
  字符串6
  字符串7
  字符串8
  字符串9
  字符串10

在第一个版本中,代码每次通过循环时都会将结果中的值替换为新值。

在第二个版本中代码将新字符串连接到上一个结果