在没有视图控制器的情况下呈现视图控制器 - Swift / Objective-C

3
我正在创建一个应用程序,该应用程序实现了Facebook和Twitter服务。在我的视图中,我有一个按钮,可以切换在Facebook/Twitter上分享或不分享。如果没有连接到Facebook/Twitter,则按钮将显示“连接到”。
当我单击该按钮时,我的控制器中的方法(而不是我的视图控制器)将尝试切换该值,因为此控制器跟踪我的应用程序的状态。当我未连接到社交网络时,我的控制器会注意到并调用正确的服务。该服务将启动一个Web视图以提供用户凭据。
现在我的问题是:
当我在我的服务中需要通过Web视图提供凭据时,我需要传递一个视图控制器来处理演示。如何在这里提供视图控制器?
我发现的方法有以下几种: 1. 调用appdelegate单例并获取当前演示的视图控制器(我认为这很不好,但如果我错了,请纠正我)。 2. 由于我在appdelegate.didFinishLaunchingWithOptions中将我的服务注入到我的控制器中,因此我可以注入应用程序委托的UIWindow,并询问当前呈现的视图控制器(与第一种方法几乎相同)。 3. 创建一个由视图控制器实现的协议。服务具有与该协议相等的属性,并在我的app delegate中将视图控制器注入服务中。 4. 在您的控制器中有一个将作为presentingviewcontroller的属性,并让您的控制器实现第3种方法协议。当该协议的函数被触发时,控制器将处理它并使用presentingviewcontroller属性进行Web视图。我只需要在appdelegate中将一个视图控制器注入我的控制器即可。 5. 不要在该服务中实现任何与视图相关的内容。
我目前的实现是第3种方法。
如果有什么不清楚的地方,请告诉我。
非常感谢您提供的任何帮助!

你能告诉我你查询中使用的所有类的名称和类型吗? - Sukhpal Singh
你的查询中的“types/classes”是什么意思不太确定。能否请您提供更多信息? - Mathias Van Houtte
1个回答

2
我希望这个问题能得到更多的关注,我很想知道其他人会如何处理这种情况。
正如您已经提到的,有几种方法可以实现您所需的功能,但答案取决于是否了解应用程序的知识。
我肯定会尽可能将业务逻辑和用户界面(UI)分开,有两种方法可以做到这一点,但它们基本上是相同的。
  1. 使用回调函数使(非UI)控制器负责登录检查,然后将控制器保留为业务逻辑,调用ViewController则负责呈现任何UI。
  2. 像您建议的那样,使用协议,您的控制器可以具有符合协议的ViewController的委托。然后,使用就只需要获取共享实例,设置委托并调用所需的功能。
我可能会更倾向于选项2,因为它更符合Swift的特点,即一个协议导向的语言。
如果控制器在全局范围内操作并且可以从应用程序中的任何位置访问,则可能会重复大量代码以进行这些检查,您可以通过创建UIViewController的扩展来解决此问题,该扩展提供与控制器交互的功能。
希望这可以帮助到您,也很有趣看到其他人如何解决这个问题。

谢谢您的快速回复!我认为选项2非常好,但是您的控制器会依赖于您的Facebook服务/SDK(不确定这是否是一个坏事,因为您的控制器处理所有业务逻辑)。我选择我的方法的原因是我希望我的Facebook服务处理所有逻辑,因为如果我想要使用不同的Facebook SDK(可能永远不会发生),我只需要更改我的服务类。这就是我在我的服务中使用协议和视图控制器的原因。 - Mathias Van Houtte
1
是的,我同意。唯一的问题是它确实有用户界面,但是您的社交服务可以使用应用程序委托来获取当前呈现的视图控制器并使用它,如果您想要完全解耦,但正如您所说,您不太可能取代Facebook作为社交平台。在这种情况下,将其保持自包含是有意义的。我会关注这个问题,看看是否有更多答案,也许会有人提出完全更好的解决方案。 - Scriptable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接