Swift - Segue 没有被传递正确的数据

Posted

技术标签:

【中文标题】Swift - Segue 没有被传递正确的数据【英文标题】:Swift - Segue not being passed correct data 【发布时间】:2016-03-06 09:28:03 【问题描述】:

在 swift 中相当新。目前,我有一个程序,单击一个按钮,我发出一个 NSURL 请求,获取该响应,解析 XML,并将我需要的数据存储到一个数组 [String] 中。按下此按钮还可以作为进入表视图控制器的转场,该控制器将使用数组中的信息动态填充。

我看到的是 segue 正在发生,并且在我的请求甚至完成并解析响应之前,下一个 VC 正在传递一个空数组。 (这完全基于我在几乎每隔一行插入的打印语句,以跟踪我的代码的执行)。

我怎样才能做到这一点,以便在解析我的响应之前,segue 不会将我带到下一个 VC?

class start: UIViewController, NSURLConnectionDelegate, NSXMLParserDelegate  

var timeArr:[String] = []
var url = "myurl.com" 
@IBOutlet weak var get2: UIButton!
@IBAction func getAction(sender: UIButton) 


    var request = NSMutableURLRequest(URL: NSURL(string: url)!)
    httpGet (request) 
        (data, error) -> Void in
        if error != nil 
            print(error)
            mainInstance.arrivalArr.append("no arrival times")
         else 
            self.beginParsing()
            print(data)
        
    



func httpGet(request: NSURLRequest!, callback: (String, String?) -> Void) 
    var session = NSURLSession.sharedSession()
    var task = session.dataTaskWithRequest(request)
        (data, response, error) -> Void in
        if error != nil 
            callback("", error!.localizedDescription)
         else 
            var result = NSString(data: data!, encoding:
                NSUTF8StringEncoding)!
            self.data2 = data!
            callback(result as String, nil)
        
    
  task.resume()



func beginParsing()

    posts = []
    parser = NSXMLParser(data: data2)
    parser.delegate = self
    parser.parse()


func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])

    element = elementName
    if (elementName as NSString).isEqualToString("prd")
    
        // more code
    


func parser(parser: NSXMLParser, foundCharacters string: String)

    if element.isEqualToString("prdtm") 
        //code 

    


func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)

    if (elementName as NSString).isEqualToString("prd") 
        if !title1.isEqual(nil) 
            //code
        

       //code
        finalTimeStr = getTime(finalTimeStr)
        timeArr.append(finalTimeStr)

    




func getTime (time: String) -> String
    var arrivalTime = time
    //code to trim and format time here
    var timeA = getTimeDiff(arrivalTime)
    timeA = trimToMin(timeA)
    return timeA




func trimToMin (timeToTrim : String) -> String 
    var timeInMin = timeToTrim
    //code to trim to minutes
    return substring2


func getTimeDiff (time: String) -> String
    //code to find time difference
    let ret = stringFromTimeInterval(diff)       
    return ret


func stringFromTimeInterval(interval: NSTimeInterval) -> String 
    //code to format interval
    return String(format: "%02d:%02d:%02d", hours, minutes, seconds)



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if let CDview = segue.destinationViewController as? ListView 
        CDview.timeArr = timeArr
        //CDview.timeArr = mainInstance.arrivalArr
    



override func viewDidLoad() 
    super.viewDidLoad()


override func viewWillAppear(animated: Bool) 
   timeArr = testArr



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

不知道我哪里出错了。这特别令人困惑,因为如果我使用硬编码字符串并直接跳转到 getTimeDiff ,那么它工作得非常好,并且我在下一个 VC 上的表格视图看起来也很棒。将不胜感激任何帮助。在过去的 12 个小时里,我确实移动了这段代码,试图理解它为什么不起作用。

【问题讨论】:

你确定你得到了同步/异步的东西吗? NSURLSession API 是高度异步的。因此,您应该从代码而不是从 nsurlsessions 完成处理程序中的按钮开始 你有没有在 stryboard 中从 UIButton 到目标视图控制器添加 segue? 是的,这就是问题所在——我设置了从按钮到目标视图控制器的 segue。我应该从整个视图控制器中设置它。 【参考方案1】:

在 storyboard 中添加来自视图控制器(而不是 UIButton)的 segue。并根据需要命名(情节提要标识符)。解析数据后,使用 performSegue(...) 以编程方式执行 segue。

【讨论】:

哇,我怎么没想到。就是这样。非常感谢。

以上是关于Swift - Segue 没有被传递正确的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?

通过 Segue 传递数据(swift 2)

使用 Swift 3 将数据从 Modal Viewcontroller 传递到 rootController(不要 Segue)

Facebook 登录后,Swift 项目没有正确地进行 segue

如何在 Swift 中的两个场景之间传递数据?

在 swift 2 中通过 segue 传递数据