在自定义 segue 中使用 destinationViewController 按钮

Posted

技术标签:

【中文标题】在自定义 segue 中使用 destinationViewController 按钮【英文标题】:Use destinationViewController button in a custom segue 【发布时间】:2013-03-09 14:12:13 【问题描述】:

我的目标是使用自定义动画制作自定义转场,如下所示: 我希望 segue 用来自 destinationViewController 的按钮覆盖来自 sourceViewController 的按钮,其效果类似于导航控制器的推送效果,即新按钮应该将旧按钮从右向左推开。

我已经能够根据需要使旧按钮(来自 sourceViewController)移开:

[UIView animateWithDuration:1.0 animations:^
        // set the target frame for animated view
        sourceViewController.optionsButton.frame = leftButtonTargetFrame;
     completion:^(BOOL finished) 
        [navigationController pushViewController:destinationViewController animated:NO];
        // reset the button's frame back to its original frame
        sourceViewController.optionsButton.frame = leftButtonInitFrame;
];

但我正在努力让新按钮(来自destinationViewController)移入。原因是我无法访问destinationViewController 的视图元素:在执行segue 时,它​​们没有被实例化。而且我无法为未实例化的按钮设置动画。

那么如何用destinationViewController 中的按钮替换sourceViewController 中的按钮?

【问题讨论】:

【参考方案1】:

当您尝试访问按钮时,目标视图控制器的视图尚未初始化/加载。要加载目标视图控制器的视图,您可以简单地访问视图属性。在使用按钮之前执行此操作:[destinationViewController view];

destinationViewController.view; 也可以,但会产生编译器警告。

背景资料:

如果您访问view 属性并且它的值当前为nil,则视图控制器会自动调用loadView 方法并返回结果视图。

方法loadView 加载控制器管理的视图。你永远不应该直接调用这个方法。

【讨论】:

【参考方案2】:

您是正确的,您不能为尚不存在的对象设置动画。但是,您可以伪造它。

    创建一个占位符按钮,该按钮看起来与新视图控制器中的按钮相同。 将其动画到正确的位置。 当目标视图控制器进入时,它的按钮应该是不可见的。 在视图控制器就位后(即 segue 完成),目标视图控制器可以确保其按钮的正确放置并使其实际按钮可见。

希望这会有所帮助。

【讨论】:

这听起来像是一个很好的解决方案。然而,这似乎有点迂回,因为每次我想修改按钮时,我都必须在两个地方更改代码。有没有办法为“真实”按钮设置动画? 文档:根据Configuring the Destination Controller When a Segue is Triggered 和The Life Cycle of a Segue,目标视图控制器应该在执行segue 时初始化。

以上是关于在自定义 segue 中使用 destinationViewController 按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义 UITableViewCell 按钮和第二个视图之间创建一个 segue

为什么在自定义交叉溶解segue中视图控制器的主视图不对齐?

自定义 Segue 中的 CATransition

如何在 Swift 3 中使用 BFTask?

执行由 UITableViewCell 调用的 Segue

如何将 indexPath 从 segue 传递到目标视图?