在放松继续行动之前如何做一些事情?

我刚刚弄清楚什么是放松时间,以及如何使用这个问题的伟大答案。 非常感谢。

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

比方说,场景B中有一个button,将场景展开到场景A,在场景之前,我想要完成某些操作,例如将数据保存到数据库。 我在B.swift中为这个button创build了一个动作,但似乎直接进入了场景A而没有采取指定的动作。

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

谢谢。

您可以按照您所描述的方式执行此操作,也可以通过在您正在展开的viewController中使用prepareForSegue重叠函数来执行此操作:

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

要么…

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

第一个例子就像你所描述的那样。 该button连接到展开顺序和Interface Builder中的button操作。 button动作将在继续动作之前触发。 也许你没有将动作连接到界面生成器中的button?

第二个例子让你可以访问segue的sourceViewControllerdestinationViewController ,以防万一也是有用的(你也可以在目标视图控制器的unwind segue函数中获得这些)。

如果你想延迟unwind segue,直到button的本地动作完成,你可以使用self.performSegueWithIdentifier (或者按照wrUS61的build议)直接从button动作调用segue(而不是挂在storyboard上)

编辑

你似乎有一些怀疑,你是否可以通过把你的button连接到一个unwind segue和一个button的动作。 我已经build立了一个这样的testing项目:

 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有一个连接在故事板上的button, unwindToRed展开segue和actionForUnwindButtonbutton。 它也覆盖了prepareForSegue所以我们可以logging玩的顺序。

输出:

 actionForUnwindButton prepareForSegue unwindToRed 

故事板:

在这里输入图像说明

编辑2

您的演示项目显示这不起作用。 不同的是,你正在使用barButtonItem来触发这个动作,而我正在使用一个普通的button。 barButtonItem失败,而常规button成功。 我怀疑这是由于消息传递顺序的差异(接下来是猜想,但与观察到的行为相符):

(A)View Controller中的UIButton

ViewController的button接收touchupInside
– (1)向其方法发送行动
– (2)向故事板延续发送缓动动作
所有收到的消息,以及按此顺序执行的方法:

 actionForUnwindButton prepareForSegue unwindToRed 

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

工具栏buttonItem接收touchupInside
– (1)向故事板延续发送缓动动作
– (2)(可能,然后)发送action到viewController的方法

执行顺序是

 prepareForSegue unwindToRed actionForUnwindButton 

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

 prepareForSegue unwindToRed 

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

所以看来你的select是…
(a)使用带有动作的UIButton并展开继续
(b)使用prepareForSegue触发你的动作,当viewController还活着时,在segue发生之前触发。
(c)不要使用unwind segue,只需使用button动作。 在操作方法中,您可以通过在导航控制器上调用popToViewController来“放松”。

顺便说一下,如果你在viewController(不使用导航控制器的工具栏)上实现一个工具栏,结果是一样的:先触发segue,所以button操作失败。

在这里输入图像说明

如果你能够成功执行unWind segue。 然后,在目标视图控制器中的方法在segue发生之前调用,您可以使用segue对象在源视图控制器中执行任何您想要的操作。

 - (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue { CustomViewController *vc = (CustomViewController*) unwindSegue.sourceViewController; [vc performAnyMethod]; [vc saveData]; NSString *temp = vc.anyProperty; } 

如果您希望在源代码pipe理器中使用逻辑,则在场景B中实现prepareForSegue,并在场景B中的退出下的Storyboard> Left View hierarchy Panel>中设置unWind segue标识符。

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([[segue identifier] isEqualToString:@"backToSource"]) { NSLog(@"Going Back"); } } 

首先,你应该在prepareForSegue方法中调用send数据函数。

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([[segue identifier] isEqualToString:@"UnwindIdentifier"]) { // send data } } 

如果您不希望在从服务器获得响应之前让unwind继续发生,则应该覆盖

 - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

方法并return NO; 。 然后,通过调用以下命令获得服务器响应时,可以手动执行segue:

 [self performSegueWithIdentifier:@"UnwindIdentifier" sender:sender]; 
Interesting Posts