如何在不传递委托的情况下从 RootViewController 调用 AppDelegate 方法?

Posted

技术标签:

【中文标题】如何在不传递委托的情况下从 RootViewController 调用 AppDelegate 方法?【英文标题】:how to call an AppDelegate method from RootViewController without passing a delegate? 【发布时间】:2011-04-21 23:01:31 【问题描述】:

只是想知道是否有办法做到这一点? (或者我需要在 RootViewController 中创建一个委托对象来保存对 AppDelegate 的引用)

【问题讨论】:

【参考方案1】:
[[[UIApplication sharedApplication] delegate] someMethod];

像魅力一样工作!

【讨论】:

感谢 Daniel - 使用它来调用 AppDelegate 中的方法(在我的情况下为 saveCoreData 方法)没有什么问题吗?即,这与最佳实践或任何事情没有任何关系? 这种方法的问题是,如果您在调用应用委托类中定义的自定义方法而没有正确转换它时会收到编译器警告。 就我个人而言,我不喜欢这种使用 App-Delegate 的方式,因为它将调用 viewController 硬连线到特定于应用程序的 App-Delegate 的实现,从而显着降低调用 viewController 的可重用性其他项目。因此,如果您问我,请不要这样做,而是定义适当的协议或使用 NSNotification。 @Till 我同意这一点,但这取决于项目的规模。花在设计和架构上的时间必须像其他任何事情一样与项目的规模成正比,如果我正在制作一个需要一天才能完成的一次性应用程序,我可能不介意将类耦合在一起。【参考方案2】:

您可以使用任何控制器访问应用程序委托

MyDelegate* aDelegate = (MyDelegate *)[[UIApplication sharedApplication] delegate];

【讨论】:

【参考方案3】:

这种情况经常发生,所以我总是向MyCustomAppDelegate 添加一个方法来为我做这件事(所以我的代码中没有太多的转换。

@implementation MyCustomAppDelegate ()
- (MyCustomAppDelegate *)appDelegate 
  return (MyCustomAppDelegate *)[[UIApplication sharedApplication] delegate];

@end

现在可以打电话到任何地方

[MyCustomAppDelgate appDelegate]

【讨论】:

以上是关于如何在不传递委托的情况下从 RootViewController 调用 AppDelegate 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不渲染的情况下从 forwardref 组件添加 ref?

如何在不使用表单的情况下从 jsp 调用 servlet

如何在不丢失“this”上下文的情况下从 React 组件中写入 apollo 缓存

如何在不阻塞的情况下从 Flux 获取列表?

如何在不更改顺序的情况下从 plist 加载数据

如何在不提供 C# 管理员凭据的情况下从标准用户启动进程