【问题标题】:Access the same object inside two different nib files在两个不同的 nib 文件中访问同一个对象
【发布时间】:2012-08-04 14:13:56
【问题描述】:

我想知道如何在两个不同的 Xib 中访问特定类的对象的相同引用。

我知道通过为每个 xib 中的类创建对象引用会创建不同的对象。即使在使用 AppDelegate 时,它​​也会创建不同的对象。 我想要实现的是两个 xib 中的引用对象应该是相同的(例如,我可以将该对象用作两个不同表视图的数据源。)

【问题讨论】:

  • 听起来你想在你的笔尖中使用一个外部对象。看看这个问题的公认答案:stackoverflow.com/questions/6950674/…
  • @rob - 是的。这就是我正在寻找的解决方案。非常感谢。但唯一的问题是我不知道在哪里可以找到外部/代理对象。我在我的对象库中找不到它。我正在使用 Xcode 4.2。
  • This image 向您展示了外部对象在对象库中的样子。我在这里找到了图片:musart.tistory.com/49
  • 尝试在对象库下的搜索框中输入“external”。
  • Xcode 4.2 中没有它。你指的是哪个版本?

标签: objective-c cocoa-touch cocoa xib nib


【解决方案1】:

只创建一次对象,然后把它放在你可以从两个类中得到它的地方。例如,您可以创建对象作为应用程序委托的属性。然后添加

AppDelegate *app = [[UIApplication sharedApplication] delegate];

到您的类(在导入 AppDelegate.h 之后)并使用 app.objectName 访问对象。

【讨论】:

  • 但我想我仍然不能将它用作我的 xib 中的对象。在我的两个不同的 xib 中创建一个 AppDelegate 对象仍然会返回我有两个不同的 iVar 的两个不同的 AppDelegate 对象。
  • 在代码中使用 [NSApp 委托](在可可中)并访问 AppDelegate 对象每次都会返回相同的对象,就像你说的那样。但是当我在每个 xib 中创建一个 AppDelegate 对象并将它们中的每一个作为我的应用程序的委托时,它会返回不同的对象。
  • 那么不要新建AppDelegate对象;上面的代码只是创建了一个指向现有应用程序委托的指针。如果这就是您的代码中的全部内容,那么您将不会创建另一个(如果可能的话)。
  • @Dustin-这就是我的想法,但是当我在 xib 中获取 AppDelegate 对象时,它并没有将这个对象指向 NSApplication 的当前委托,而是将这个新对象作为委托。我猜正在发生以下代码之类的事情:AppDelegate *appD = [AppDelegate alloc] init];[NSApp setDelegate:appD];
【解决方案2】:

另一个答案会起作用,但这是一个糟糕的设计。

您应该坚持使用tell don't ask rule。为您的对象提供您希望它们使用的数据源,不要让它们要求数据源,这实际上是一个令人讨厌的全局。

另一个问题是您对笔尖的理解。它们存储一个对象图,当加载一个 nib 时,该图未存档,并且其中的每个对象都被实例化。如果您在图中有两个相同的对象,那么您最终会得到两个实例而不是两个对一个实例的引用。当您拖出多个视图时也是如此,您最终会得到多个 UIView 实例(和子类),这正是您所期望的。

努力了解在 nib 中可以/不可以做什么与在代码中必须做什么以及它们如何组合在一起之间的界限是非常值得的。

【讨论】:

  • 你说得对,这是更好的设计。实际坚持并解释它而不是提供简单的解决方案的道具。
  • @Dustin 我刚刚注意到 robmayoff 在实际问题下的评论是最好的选择,我什至不知道该怎么做,所以这很酷
  • @Dustin - 进一步考虑,它的用例相当有限。 UIViewController 会自动处理加载 nib,因此您必须重新实现这项工作,然后通过情节提要,您离能够使用它更远了。但是对于独立的 xib,它可能很酷,尽管我认为在加载 nib 后调用设置属性与使用正确的键等构造字典一样容易。
  • 我还没有完全理解。你们可以看看我发布的这个问题吗:stackoverflow.com/questions/11666917/…
  • 现在我通过在AppDelegate 中声明一个数组然后在我的每个数据源对象中获取AppDelegate 对象([NSApp delegate])来在两个不同的xib 中填充两个表视图以访问大批。有没有其他方法可以做到这一点?
【解决方案3】:

有趣!
尝试使用单例方法,查看此链接 http://www.duckrowing.com/2010/05/21/using-the-singleton-pattern-in-objective-c/
使用这种方法,您可以创建一个在整个应用程序生命周期中都可用的实例

【讨论】:

  • 如前所述,这是解决此问题的一种非常糟糕的方法。
  • 无意冒犯@Paul.s,但为什么这是错误的设计?您有一个可用于共享数据的实例,而 Core Data 可用于持久化。
  • 测试很糟糕。它只是一个全局变量,通常很糟糕。它增加了代码中的耦合,使其更加脆弱。它使您的代码的可重用性降低。单例确实有它们的用途,但这对它们来说是一个糟糕的用例。
猜你喜欢
  • 1970-01-01
  • 2021-11-29
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多