UIViewController 作为单例

Posted

技术标签:

【中文标题】UIViewController 作为单例【英文标题】:UIViewController as a singleton 【发布时间】:2011-04-25 18:36:24 【问题描述】:

我在标签栏应用程序中有一个 UIViewController。我已经从 MainWindow.nib 文件中添加了控制器(即不是以编程方式)。

我的问题是如何使我的视图控制器成为单例? (解决 Facebook 代表问题)。

【问题讨论】:

这是一个非常糟糕的主意。正是这种对单例的滥用,使得许多更有经验的程序员建议一起避免它们。 不,但是将视图控制器实现为单例确实很可疑。 【参考方案1】:

您可能希望将“Facebook 连接代码”设为单例(或应用程序委托的一部分),而不是视图控制器本身。然后只需将 FB 的东西与任何需要它的视图控制器连接起来。

【讨论】:

【参考方案2】:

如果您真的想创建单例(但我不认为您这样做,请重新考虑您的设计 - 究竟什么是“facebook 代表问题”?),请看这里in Apple's sample code

【讨论】:

嗨,我真的不想这样做,但在阅读了一些类似的帖子后:***.com/questions/4215797/… 和 ***.com/questions/4244609/fbdidlogin-not-called 我觉得这是唯一的解决方案。 上周我自己做了一个 FB 控制器。在这个视图控制器的生产过程中没有单例受到伤害;-) 澄清一下,如果使用 FB 库的多个客户端确实存在问题(我不知道,只是从您的评论中猜测)那么您仍然应该没有问题,视图控制器是不是凭空创造的。 @OK,那么您是如何让代理工作的呢?在我的应用程序委托中,我添加了 someView=[[SomeView alloc]init] 然后我按照建议实现了 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 。但是,我的 SomeView 控制器中的 fbDidLogin 方法没有声音。 我使用了来自 FB SDK 的股票代码,它工作正常。您是否尝试过使用“内联 Web 视图”授权样式?顺便说一句,我的应用程序适用于两种样式。你说你使用 nib,但同时也使用程序化实例化(someView=[[SomeView alloc]init])?【参考方案3】:

您可以将任何类设为单例,将类似的内容添加到 .m 文件中(并且您还必须在 .h 中添加声明):

+ (id)sharedInstance 
  static id sharedInstance;
  @synchronized(self) 
    if (!sharedInstance)
      sharedInstance = [[ClassName alloc] init];
    return sharedInstance;
  

【讨论】:

以上是关于UIViewController 作为单例的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIPopoverController 不是 UIViewController 的子类?

在 UIViewController 中创建整个 UIView

更改 UITabBar 高度

以编程方式向 UIView 或 UIViewController 添加约束?

Interface Builder 是如何知道 UIViewController 的视图的?

如何在 SwiftUI 中使用 UIViewController 和 UIView?