gpt4 book ai didi

iOS segue 在显示新 View 之前卡住多秒

转载 作者:IT王子 更新时间:2023-10-29 05:21:21 25 4
gpt4 key购买 nike

在我的应用程序的主视图中,我有一个表格 View 和两个原型(prototype)单元格。我已经使用 Storyboard为每个单元格配置了转场。在 View Controller 中,我覆盖了 prepareForSegue 以将所选单元格的信息传递到目标 View 。

目标 View 不是特别复杂,当然不需要任何繁重的处理来加载。

问题

当我第一次点击主 Controller 中的单元格时,目标 View 会在 5 到 40 秒的长时间延迟后出现。

编辑 #2:后续点击通常更快

注意:

  • 如果我在目标 View 出现之前再次点击同一个单元格,这会触发目标 View 立即出现。
  • 同上,但点击不同的单元格会导致 View 立即出现,但会显示来自第一个单元格的数据。
  • 同上,但点击不同的控件(没有关联的 segues)会触发目标 View 立即出现。
  • 随后的“敲击”通常表现出较少的延迟。
  • Time Profiler - 据我所见 - 显示在那么多秒的延迟期间绝对没有发生任何事情。
  • 我尝试过不同类型的转场,但没有任何区别
  • 一些 println 显示发生了以下事件序列:

    • 在主视图中,执行 prepareForSegue(无延迟)
    • 然后执行目标 viewDidLoad(无延迟)
    • ...长时间延迟...
    • 目标 Controller 中的集合和 TableView 开始调用数据源相关方法从 Controller 中获取数据。
    • View 终于出现了(顺便说一句,有一个不需要的动画,但那是另一个问题)

根据我对这个主题的阅读,我怀疑这个问题可能与后台线程中发生的上述某些操作有关。

知道我可能做错了什么吗?

编辑 #1:添加了一些代码

在主视图 Controller 中,segues 已使用 Storyboard链接(CTRL-将两个原型(prototype)单元格拖到目标 View 中)。

代码看起来有点像下面:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
var assetIndex = assetsTable.indexPathForSelectedRow()?.row

println("prepare for segue - start: \(assets[assetIds[assetIndex!]]!.Name)")

if let destination = segue.destinationViewController as? AssetThingsListViewController
{
destination.bundlesRepository = bundlesRepository!
destination.asset = assets[assetIds[assetIndex!]]
}

println("prepare for segue - end")
}

编辑 #3 我已经在 BitBucket 上提供了一个示例项目

最佳答案

我检查了你的项目。虽然我也找不到其他任何东西,但我也怀疑这是线程问题。

我设法通过为 tableview 实现委托(delegate)并在代码中呈现新 Controller 来解决问题:

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

let destination = storyboard?.instantiateViewControllerWithIdentifier("BuilderToysListViewController") as! BuilderToysListViewController
destination.botsRepository = botsRepository!
destination.builder = builders[builderIds[indexPath.row]]

dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.presentViewController(destination, animated: true) { () -> Void in

}
})

}

请注意,您已经设置了 View Controller Storyboard ID:BuilderToysListViewController 并且还设置了 tableview 委托(delegate)。不要忘记删除 segues。

最后在新的 View Controller 中关闭 View 使用这个代码:

@IBAction func backButton(sender: AnyObject)
{
dismissViewControllerAnimated(true, completion: { () -> Void in

})
// performSegueWithIdentifier("segueToysByBuilder", sender: nil)

}

这将使您能够正确地关闭 View ,而不是错误地创建一个新 View 。

关于iOS segue 在显示新 View 之前卡住多秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30823544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com