【问题标题】:Swift: performSegueWithIdentifier during unwind not workingSwift:在展开期间 performSegueWithIdentifier 不起作用
【发布时间】:2016-03-18 09:47:40
【问题描述】:

我使用 segue to Exit 技术以编程方式创建的按钮创建了一个从视图控制器 #2 到视图控制器 #1 的典型展开流程。

我有跟踪语句确认按钮代码正在完美执行,并且 #2 performSegueWithIdentifier 函数正在使用正确的 segue ID 调用,但没有任何反应。

澄清一下:

我已将视图控制器#2 连接到出口并确认 segue ID 在所有位置都是准确的。我在#2 performSegueWithIdentifier 函数中跟踪了#2 标识符,它完全匹配。

据我了解,我不再需要对当前版本的 2016 XCode 使用 dispatch 修复。无论如何我都试过了,但没有任何效果。没有崩溃,只是没有放松。

不知何故,使用此退出技术时,展开技术并未逆转。有什么想法吗?

我一直在关注这里的教程:https://spin.atomicobject.com/2014/12/01/program-ios-unwind-segue/

代码 VC #2:

// action func wired to button, fires perfectly
func unwind(seg:UIStoryboardSegue!) {

    self.performSegueWithIdentifier("unwind", sender: self)
}

【问题讨论】:

  • 你能把你在vc1里的代码和vc2里的代码展示一下吗?
  • 没什么大不了的。上述两个函数都能完美触发,并使用我使用的确切 segue 名称跟踪打印语句。 :( V2 中唯一的代码是根本不会触发的 viewDidLoad 函数。
  • 你没有实现performSegueWithIdentifier;这是由 UIViewController 实现的。带有 UIstoryboardSegue 参数的 IBActionMethod 应该在 VC1 中(它有一个空实现)。您在按钮处理程序方法中调用self.performSegueWithIdentifier,如果您不使用情节提要,则不需要@IBAction
  • 好吧,我尽我所能尝试了,但现在它抛出了大量错误,因为缺乏对 VC 的 segue 分配的识别。据我了解,展开方法是我将一个 segue 排队到 vc2 的出口以简单地“离开”舞台,从而返回堆栈中的下一个 VC,即 VC1。我只使用了 VC2 中的 performSegueWithIdentifier 来追踪 segue 名称。我删除了 IBAction 前缀。
  • 使用 unwind segue 进行演示,

标签: ios swift unwind-segue


【解决方案1】:

在 VC1 中你需要一个函数:

@IBAction func unwindToVC1(segue:UIStoryboardSegue) {
}

然后在情节提要中按 ctrl 从黄色视图控制器图标拖动到退出图标并从弹出窗口中选择 unwindToVC1:

给 unwind segue 一个标识符,比如unwindToVC1

现在,在 VC2 中,创建您的按钮 touchUpInside 处理程序:

func buttonTapped(sender:UIButton) {
    self.performSegueWithIdentifier("unwindToVC1")
}

当您以编程方式设置按钮时,将此方法添加为操作处理程序:

button.addTarget(self, action: "buttonTapped:", forControlEvents: .TouchUpInside)

【讨论】:

  • 好的,这对我来说完全有意义,但现在我收到一个运行时错误,即 vc2 无法识别来自 vc1 的 segue 名称。
  • 您可以按住 ctrl-drag 退出 VC3 并再次选择 unwindToVC1: 并为该 segue 提供一个标识符,它的工作方式相同。本技术说明解释了 unwind segues 的工作原理developer.apple.com/library/prerelease/ios/technotes/tn2298/…
  • 我这样做了,但它创建了一个空白的 VC1 的新实例。听起来对吗?我正在尝试利用 VC1 上的先前渲染并简单地返回它。有错吗?
  • OK,缺少步骤:将 CRT-DRAG-EXIT 添加到 VC2 并将其指向 VC1 segue。 Apple 文档提到的是创建一个需求。就是这样!现在效果很好!谢谢!
【解决方案2】:
  1. unwind 函数移至VC1。将该实现留空,或者放置一个打印语句以查看它是否进入该函数。
  2. 确保情节提要中有一个使用标识符“unwind”创建的展开转场
  3. 在 VC2 中添加一个调用 performSegueWithIdentifier("unwind"...) 的按钮操作函数 buttonAction:(button:UIButton)
  4. buttonAction 设置为以编程方式创建的按钮的操作。

【讨论】:

  • 如何让VC2识别只存在于VC1中的segue?我收到一个无法识别的 segue 名称的运行时错误。
  • 感谢您的帮助!明白了!
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 2012-05-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多