ios – 如何在放松行动之前做些什么?

我刚才弄清楚了什么是放松时间,以及如何使用它从 this问题的伟大答案.非常感谢.

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

我们假设现场B中有一个按钮可以将场景A解开,并且在它之前我想要完成某些操作,例如将数据保存到数据库.我在B.swift中为这个按钮创建了一个动作,但是它似乎直接进入场景A,而不需要指定动作.

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

谢谢.

解决方法

您可以按照您所描述的方式执行此操作,或者在您正在展开的viewController中使用prepareForSegue override函数:
@IBAction func actionForUnwindButton(sender: AnyObject) {
    println("actionForUnwindButton");
}

要么…

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

第一个例子是你所描述的.该按钮连接到展开区域,并在Interface Builder中连接到按钮操作.按钮操作将在segue操作之前触发.也许您没有将操作连接到界面构建器中的按钮?

第二个例子使您可以访问segue的sourceViewController和destinationViewController,以防万一也很有用(您也可以在目的地视图控制器中的unwind segue的功能中获得这些).

如果要延迟展开顺序,直到按钮的本地动作完成,您可以使用self.performSegueWithIdentifier(或按照wrus61的建议)直接从按钮操作调用segue(而不是在故事板中挂起)

编辑

你似乎有一些怀疑,无论您是否可以通过将您的按钮连接到放卷和按钮操作来实现.我已经建立了一个这样的测试项目:

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有一个按钮,在故事板中连接到BindH的展开卷展开和动作ForUnwindButton按钮.它也覆盖了prepareForSegue,所以我们可以记录播放顺序.

输出:

actionForUnwindButton
prepareForSegue
unwindToRed

故事板:

编辑2

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

(A)视图控制器中的UIButton

ViewController的按钮接收到touchupInside
– (1)向该方法发送动作
– (2)向故事板发送segue展开动作
收到的所有消息和按此顺序执行的方法:

actionForUnwindButton
prepareForSegue
unwindToRed

(B)导航控制器工具栏中的UIBarButtonItem

工具栏buttonItem接收touchupInside
– (1)向故事板段发送segue展开动作
– (2)(可能的话)将action发送给viewController的方法

执行顺序是

prepareForSegue
unwindToRed
actionForUnwindButton

prepareForSegue和展开收到的消息.然而actionForUnwindButton消息被发送到nil,因为viewController在segue期间被销毁.所以它不会执行,日志打印

prepareForSegue
unwindToRed

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

所以看来你的选择是…
(a)使用UIButton与动作和放松segue
(b)使用prepareForSegue触发您的操作,这将在viewController仍然存在时触发,并在segue发生之前触发.
(c)不要使用放卷,只需使用按钮操作.在动作方法中,您可以通过在导航控制器上调用popToViewController来“展开”.

顺便说一下,如果在viewController上实现了一个工具栏(不使用导航控制器的工具栏),结果是一样的:首先触发segue,因此按钮操作失败.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...