如何将 AppDelegate 中对象的引用传递给 ViewController

Posted

技术标签:

【中文标题】如何将 AppDelegate 中对象的引用传递给 ViewController【英文标题】:How can I pass referece from an object in AppDelgate to ViewControllers 【发布时间】:2012-05-02 13:14:23 【问题描述】:

我在 Xcode 中使用情节提要创建了一个应用程序。该应用程序包含一个 UITabBarController (TBC) 和一些 UIViewControllers (VC),由 TBC 控制。

在 AppDelegate 中创建一个对象(我们称之为“myMidi”),它将监听传入的 MIDI 消息(CoreMidi)。所以我在我的 VC 中实现了这个 myMidi-Object 的接口。 我使用 Interface Builder (IB) 中的“关系”选项将视图连接到 TBC。

在 IB 中创建的所有 VC 都是我自己的 VC 类的实例。正如我之前提到的,在这个类中,我实现了我在 AppDelegate 中创建的 myMidi-Object 的接口。 因此,每个 VC 实例都拥有一个 myMidi-Object 的地址,现在需要在 AppDelegate 中创建的唯一引用。

所以我想知道如何访问当前的 VC 或当前显示的 TBC 以将此引用传递给我的 VC 类?

或者我还能如何解决这个问题。我想我应该在 AppDelegate 中的某个地方执行此操作,或者我也应该在 TBC 中保存引用并在创建 VC 时将其传递给每个新 VC!?

【问题讨论】:

【参考方案1】:

如果我理解正确,您希望您的 MyMidi 类的当前(唯一?)实例可供您的 VC 使用?

如果您只有一个 Instance,请考虑将 MyMidi 设为单例类并为其提供类方法 à la + (MyMidi *)sharedInstance;,它始终返回(并延迟初始化)相同的对象。这样,您就可以从任何地方访问它。

请参阅this question,了解如何在 Cocoa/Cocoa Touch 中实现单例。

【讨论】:

谢谢你的回答,我试试单例。 只需要一个实例和确保只创建一个实例是有区别的,一般来说前者更可取,例如除非您需要确保只能创建一个实例,否则不要使用单例...【参考方案2】:

使用 nsdefaults setObjec:forKey: 传递对象并将其获取到您想要的位置。或者在 appdelegate 中创建一个属性并通过

AppDelegate* appDelegate = (TappAppDelegate*) [[UIApplication sharedApplication] delegate];
appDelegate.object = yourObject;

【讨论】:

以上是关于如何将 AppDelegate 中对象的引用传递给 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ManagedObjectContext 快速传递给根视图控制器

如何将一个对象的引用传递给另一个对象并仍然修改第一个对象?

如何将对象或引用传递给函数?

如何将 COM 对象的 C# 引用传递给 C++ DLL

如何将 CoreLocation 值从一个 VIewController 传递到 iOS 中的 AppDelegate?

如果它是子视图控制器,如何将 AppDelegate 中的 managedObjectContext 传递给正确的视图控制器?