不在视图控制器上呈现视图控制器 - Swift / Objective-C

时间:2016-08-09 11:05:59

标签: ios objective-c swift xcode

我正在创建一个实施 Facebook Twitter 服务的应用。在我看来,我有一个按钮可以在 Facebook / Twitter 上切换共享。如果 Facebook / Twitter 未连接,则该按钮将显示“connect to”。

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

现在我的问题是:

当我在服务中时,我需要通过webview提供凭据。当我想要显示此webview时,我需要传递一个View Controller来处理演示。我如何在这里提供一个viewcontroller?

我发现的方法:

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

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

如果有些事情不清楚,请告诉我。

任何帮助表示赞赏! 提前谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

  1. 使用回调函数使(非UI)控制器负责登录检查,然后您可以让控制器负责业务逻辑,并且调用ViewController负责通过该检查呈现任何UI。

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

  3. 我可能倾向于选择2更像Swift,因为它是一种面向协议的语言。

    如果控制器全局操作并且从应用程序内的任何位置访问,您可能最终会复制大量代码来进行这些检查,您可以通过创建UIViewController的扩展来解决这个问题,该扩展提供了与之交互的功能。控制器。

    我希望这会有所帮助,看到其他人接近这一点的方式肯定会很有趣。