区分导致视图控制器被推送的用户操作

Posted

技术标签:

【中文标题】区分导致视图控制器被推送的用户操作【英文标题】:Distinguishing the user action causing a view controller to be pushed 【发布时间】:2014-03-23 18:54:42 【问题描述】:

我正在继承 UINavigationController 并希望添加将之前弹出的视图控制器重新添加到堆栈中的功能,类似于网络浏览器中的前进按钮。

当用户按下按钮时,我想将最近弹出的视图控制器添加回堆栈。为此,我将视图控制器置于自定义堆栈的顶部,并使用它调用 pushViewController:animated:

在点击表格视图单元格或其他东西以进入视图层次结构的新方式的情况下,我想清除我的“弹出视图控制器”堆栈。类似于用户在 Web 浏览器中单击新链接时“转发”历史记录被清除的方式。

这就是我的问题所在。我不知道如何区分何时调用pushViewController:animated: 以恢复视图控制器,以及何时用户点击一个单元格来推送一个。在后一种情况下,我想清除我的堆栈,但在前一种情况下我不想。

我不知道在这里做什么。在一个完美的世界中,pushViewController:animated: 将有 userOptions: 参数或其他可以让我区分它的使用方式的东西,但不幸的是,该参数不存在。

这样的问题一定会经常出现。在这种情况下我将如何处理?如何区分调用该方法的情况?

【问题讨论】:

我不清楚这里的障碍是什么。您应该控制何时调用 pushViewController:animated;你可以事先做其他事情。当按钮被按下时,在它的 action 方法中做一件事。选择表格视图单元格后,在tableView:didSelectRowAtIndexPath: 中执行其他操作。我错过了什么? @JoshCaswell 我希望这是一个简单的插入式UINavigationController 替换。如果我必须进入每个班级并调用自定义方法而不是每个UINavigationController 使用的方法,那就不那么干净了。 我明白了。我认为与 CRD 的答案类似的东西将必须是你要走的路。我看不出有任何方法可以为按钮设置一个特殊的“前进”方法。 【参考方案1】:

如果我没听错的话,一种常见的做法是:

    你的“goForward”方法应该调用你的超类'pushViewController:animated: 覆盖 pushViewController:animated: 以同时调用超类的 pushViewController:animated: 和“clearStack”方法。

【讨论】:

对于2.,我的问题是pushViewController:animated: 在segue 期间被自动调用。而且我不想把我的clearStack 方法放在那里,因为每次发生转场时都会调用它。我不知道如何在其中注入我自己的方法。 如果在您的类的实例上调用该方法,那么您的覆盖就会被调用,不管是谁调用,这是继承的核心特性。 如果实际上我所做的只是为UINavigationController 创建一个替代品,我该如何让goForward 方法只调用super? goForward方法不是pushViewController:animated:吗? goForward 方法是前进按钮的操作方法。你使用[super ...](而不是[self ...])在你的超类上调用一个方法。【参考方案2】:

在我看来,您的子类中需要两种不同的方法。一种用于您要恢复视图控制器的情况,另一种用于您要清除堆栈的情况。两者都会执行一些自定义逻辑并在super 上调用pushViewController:animated:

【讨论】:

但是pushViewController:animated: 不会自动被segue 调用吗?我如何在那里注入我自己的方法?

以上是关于区分导致视图控制器被推送的用户操作的主要内容,如果未能解决你的问题,请参考以下文章

由于用户操作与编程设置而区分编辑已开始

如何向推送通知警报视图添加操作?

如何从呈现的视图控制器上的按钮操作推送视图控制器

推送视图控制器不显示从情节提要添加的元素

在推送视图控制器上使用当前方向

如何浏览应用程序