在视图控制器上不显示视图控制器 - Swift / Objective-C

Posted

技术标签:

【中文标题】在视图控制器上不显示视图控制器 - Swift / Objective-C【英文标题】:Present View Controller without being on a View Controller - Swift / Objective-C 【发布时间】:2016-08-09 11:05:58 【问题描述】:

我正在创建一个实现 FacebookTwitter 服务的应用程序。在我看来,我有一个按钮可以切换是否在 Facebook/Twitter 上共享。如果 Facebook/Twitter 未连接,则按钮将显示“连接到”。

当我单击按钮时,我的控制器(不是我的视图控制器)中的一个方法将尝试切换该值,因为该控制器跟踪我的应用程序的状态。当我没有连接到社交网络时,我的控制器会注意到并调用正确的服务。该服务将启动一个 webview 来提供用户凭据。

现在我的问题是:

当我在服务中并且需要通过 web 视图提供凭据时。当我想展示这个 webview 时,我需要传递一个 View Controller 来处理展示。如何在此处提供视图控制器?

我发现的方法:

调用 appdelegate 单例并获取当前演示 viewcontroller(我觉得这很脏,但如果我错了,请纠正我)。 因为我将我的服务注入到我的控制器中 appdelegate.didFinishLaunchingWithOptions 我可以注入 UIWindow appdelegate 并询问当前呈现的视图控制器 (和第一种方法差不多) 创建由视图控制器实现的协议。该服务具有等于该协议的属性,并且在我的应用程序委托中注入 视图控制器进入服务。 在您的控制器中有一个属性 这将是presentingviewcontroller,让你的控制器 实现方法#3协议。当该协议的功能 被触发,控制器将处理它并使用 呈现 webview 的 viewcontroller 属性。我只需要 在 appdelegate 中将 viewcontroller 注入到我的控制器中。 不要在该服务中实现任何与视图相关的内容。

我目前的实现是方法#3。

如果有不清楚的地方,请告诉我。

感谢任何帮助! 提前致谢!

【问题讨论】:

您能告诉我您在查询中使用的所有类的名称和类型吗? 不确定查询中的类型/类是什么意思。您能否提供更多信息? 【参考方案1】:

我希望这个问题会得到更多关注,我很想知道其他人会如何处理这种情况。

正如您已经说过的,有几种方法可以实现您所需要的,但答案取决于对应用程序的了解。

我肯定会尽量将业务逻辑和 UI 分开,我可以想到两种方法来做到这一点,但它们几乎是一回事。

    使用回调函数让(非 UI)控制器负责登录检查,然后您可以让控制器负责业务逻辑,而调用 ViewController 负责渲染任何作为检查结果的 UI。

    正如您所建议的,使用协议,您的控制器可以有一个委托,该委托将是符合您的协议的 ViewController。然后使用将只是获取您的共享实例,设置委托并调用所需的功能。

我可能更喜欢选项 2,因为它是一种面向协议的语言。

如果控制器在全局范围内运行并从应用程序中的任何位置访问,您最终可能会复制大量代码来进行这些检查,您可以通过创建 UIViewController 的扩展来解决此问题,该扩展提供与控制器。

我希望这会有所帮助,看看其他人的处理方式肯定会很有趣。

【讨论】:

感谢您的快速回复!我认为选项 2 非常好,但是您的控制器依赖于您的 facebook 服务/sdk(不确定这是否是一件坏事,因为您的控制器处理所有业务逻辑)。我采用这种方法的原因是我希望我的 facebook 服务能够处理所有逻辑,因为如果我想使用不同的 facebooksdk(可能永远不会发生),我只需要更改我的服务类。这就是我的服务中有一个带有视图控制器的协议的原因。 是的,我同意,唯一的问题是它确实有 UI,但是如果您希望它完全解耦,您的社交服务可以使用应用程序委托来获取当前呈现的 VC 并使用它,但就像你说的。您不太可能取代 Facebook 作为社交平台。在这种情况下,保持它自包含确实是有意义的。我会密切关注这个问题,看看我们是否能得到更多答案,有人可能会提出一个更好的解决方案

以上是关于在视图控制器上不显示视图控制器 - Swift / Objective-C的主要内容,如果未能解决你的问题,请参考以下文章

滚动视图上不显示文本视图

在视图控制器/页面视图控制器中使图像视图全屏显示(swift)

Swift:当前视图控制器在转换到下一个视图控制器期间重新显示

在 ios swift 中导航到其他屏幕时,不鼓励在分离的视图控制器上显示视图控制器

Swift:如何使选项卡视图控制器按钮不显示?

如何在导航控制器 SWIFT 中显示视图控制器