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 传递到另一个?
使用 Swift 3 将数据从 Modal Viewcontroller 传递到 rootController(不要 Segue)