在放松继续行动之前如何做一些事情?
我刚刚弄清楚什么是放松时间,以及如何使用这个问题的伟大答案。 非常感谢。
但是,这是一个这样的问题:
比方说,场景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的sourceViewController
和destinationViewController
,以防万一也是有用的(你也可以在目标视图控制器的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和actionForUnwindButton
button。 它也覆盖了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
prepareForSegue
和unwind
收到的消息。 然而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];