gpt4 book ai didi

ios - performSegue 并不总是转换,而是准备(对于 :sender) always called

转载 作者:搜寻专家 更新时间:2023-10-30 23:14:00 26 4
gpt4 key购买 nike

performSegue 被调用时,我的应用并不总是转到下一个 View Controller 。但是,它总是执行 prepare(for:sender) 立即

  • performSegue 在没有硬错误的情况下无法工作(并且仍然执行 prepareForSegue)的原因是什么?
  • 是否存在我需要检查的源 View Controller 应该处于的特定状态?
  • 如果我延迟 10 秒(通过 asyncAfter),就会发生 segue。

场景

我正在尝试为一项新功能(与 Spotlight 搜索集成)重新调整工作 segue。如果应用程序留在详细信息 View 中,我的 iPhone 上不会发生转换。 (该应用程序将 UISplitViewController 作为其 Root View Controller 。)

但是,代码在以下情况下按预期工作

  1. 我在我的 iPad 上进行测试 - 即,当同时显示主视图和详细 View 时。
  2. 当我将应用留在主视图时,我在 iPhone 上进行测试。

当我从详细信息屏幕测试我的 iPhone 时{请参阅下面的代码}:

  1. 详细信息屏幕消失(根据 popToRootViewController)
  2. 显示主视图,并突出显示正确的行(包括 NSLog 说“进入主视图”)
  3. 函数执行,包括 prepare(for:sender) 但从未显示详细 View 。

在这一点上,我可以点击适当的行,并且 segue 按预期发生 - 即 tableView(:didSelectRowAt:) 调用 performSegue

更多细节

swift 3.0 和 iOS 10

应用有一个 UISplitViewController 作为它的 rootViewController。主视图是一个带有食谱列表的 tableView。详细 View 是一个 tableView,列出了所选食谱的成分。 segue 从配方行选择过渡到其配料表。

我正在推出一个新功能:将配方置于聚光灯下,以便用户可以搜索它们,并且在选择时,从主视图中选择了食谱,其成分显示在详细信息中。

现在我正在尝试通过 appDelegate 的 application(:continue:restorationHandler) 实现 Spotlight 搜索集成:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {

guard userActivity.activityType == CSSearchableItemActionType,
let userInfo = userActivity.userInfo,
let id = userInfo[CSSearchableItemActivityIdentifier] as? String
else {
return false
}

// The id is a unique identifier for recipe.
if let inputRecipe = Recipe.getBy(uuid: id, moc: self.managedObjectContext) {

let root = self.window?.rootViewController as! UISplitViewController
let nav = root.viewControllers[0] as! UINavigationController

// If this is a navigation controller, then detail is being shown
if (nav.topViewController as? UINavigationController) != nil {
NSLog("Should be a detail view")
nav.popToRootViewController(animated: true)
}

if let masterVC = nav.topViewController as? RecipeMasterVC {
NSLog("Into the master")
masterVC.selectTableRowAt(recipe: inputRecipe)
}
}
return true
}

在 RecipeMasterVC 中,我将此代码添加到 segue

func selectTableRowAt(recipe: Recipe){

let indexPath = self.fetchedResultsController.indexPath(forObject: recipe)

self.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .top)
DispatchQueue.main.async {
self.performSegue(withIdentifier: seguesEnum.RecipeDetail.rawValue, sender: recipe)
}
}

最佳答案

我在我自己的应用程序中有类似的情况,没有使用 segue 但仍然使用 Split View。当我检查代码时,我发现我必须添加 200 毫秒的延迟才能使其工作。从来没有找到根本原因,但没有延迟,如果详细信息屏幕已经显示,即使调度异步也不起作用

关于ios - performSegue 并不总是转换,而是准备(对于 :sender) always called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44707713/

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