gpt4 book ai didi

ios - 在展开 segue 操作之前如何做某事?

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

我刚刚弄清楚什么是 unwind segue 以及如何使用来自 this 的出色答案问题。非常感谢。

但是,这里有一个这样的问题:

假设场景 B 中有一个按钮可以展开到场景 A,在它继续之前我想做一些事情,比如将数据保存到数据库中。我在 B.swift 中为这个按钮创建了一个 Action ,但它似乎直接进入场景 A 而没有执行指定的 Action 。

任何人都知道为什么或如何做到这一点?

谢谢。

最佳答案

您可以按照您描述的方式进行,或者通过在您要展开的 viewController 中使用 prepareForSegue 覆盖函数:

@IBAction func actionForUnwindButton(sender: AnyObject) {
println("actionForUnwindButton");
}

或者...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
println("prepareForSegue");
}

第一个示例如您所述。该按钮连接到 unwind segue 和 Interface Builder 中的按钮操作。按钮操作将在 segue 操作之前触发。也许您没有将操作连接到界面生成器中的按钮?

第二个示例让您可以访问 segue 的 sourceViewControllerdestinationViewController 以防万一这也很有用(您也可以在目标 View 的 unwind segue 函数中获得这些 Controller )。

如果您想延迟展开转场直到按钮的本地操作完成,您可以使用 self.performSegueWithIdentifier 直接从按钮操作调用转场(而不是将其挂接到 Storyboard中) (或遵循 wrUS61 的建议)

编辑

您似乎对是否可以通过将按钮连接到展开转场和按钮操作来解决这个问题有些疑问。我已经建立了一个像这样的小测试项目:

class BlueViewController: UIViewController {

@IBAction func actionForUnwindButton(sender: AnyObject) {
println("actionForUnwindButton");
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
println("prepareForSegue");
}
}


class RedViewController: UIViewController {

@IBAction func unwindToRed(sender: UIStoryboardSegue) {
println("unwindToRed");
}
}

BlueViewController 有一个按钮,在 Storyboard中连接到 unwindToRed unwind segue 和 actionForUnwindButton 按钮。它还会覆盖 prepareForSegue,因此我们可以记录播放顺序。

输出:

actionForUnwindButton
prepareForSegue
unwindToRed

Storyboard:

enter image description here

编辑 2

您的演示项目显示这 工作。区别在于您使用的是 barButtonItem 来触发操作,而我使用的是常规按钮。 barButtonItem 失败,而常规按钮成功。我怀疑这是由于消息传递顺序的差异造成的(以下是推测,但符合观察到的行为):

(A) View Controller 中的 UIButton

ViewController的按钮接收touchupInside
- (1) 向其方法发送操作
- (2) 将 segue unwind Action 发送到 storyboard segue
所有接收到的消息,以及按以下顺序执行的方法:

actionForUnwindButton
prepareForSegue
unwindToRed

(B) 导航 Controller 工具栏中的 UIBarButtonItem

工具栏buttonItem接收touchupInside
- (1) 将 segue unwind Action 发送到 storyboard segue
- (2)(可能,然后)将 Action 发送到 viewController 的方法

执行顺序是

prepareForSegue
unwindToRed
actionForUnwindButton
收到

prepareForSegueunwind 消息。但是 actionForUnwindButton 消息被发送到 nil,因为 viewController 在 segue 期间被销毁。所以它没有被执行,日志打印

prepareForSegue
unwindToRed

在 (B) 的情况下,viewController 在方法到达之前被销毁,因此不会被触发

看来你的选择是......
(a) 将 UIButton 与 action 和 unwind segue 结合使用
(b) 使用 prepareForSegue 触发您的操作,这将在 viewController 仍然存在且在 segue 发生之前触发。
(c) 不要使用 unwind segue,只需使用按钮操作。在操作方法中,您可以通过在导航 Controller 上调用 popToViewController 来“放松”。

顺便说一句,如果您在 viewController 上实现工具栏(不使用导航 Controller 的工具栏),结果是相同的:首先触发 segue,因此按钮操作失败。

enter image description here

关于ios - 在展开 segue 操作之前如何做某事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28380923/

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