【问题标题】:What can the "Object" in Storyboard's Object Library do?Storyboard 对象库中的“对象”可以做什么?
【发布时间】:2012-07-22 01:23:17
【问题描述】:

小问题

在 XCode 的界面构建器的对象库中有一个叫做 Object 的东西。我想知道使用这个“对象”可以完成什么样的任务。

具体来说,它是 Storyboard(或 xib)中的 NSObject。描述如下:

为 Interface Builder 中不直接可用的对象提供模板。您可以使用自定义类检查器将此对象转换为任何类的实例。

长问题

我正在尝试构建 UITableViewControllerUISearchController。由于他们都需要在他们的委托中实现UITableViewDelegateUITableViewDatasource,我希望我可以将UISearchController 的委托分配给除主要UITableViewController 之外的对象。

我正在寻找一种在 Storyboard 中实现此目的的方法,而不是在 viewDidLoad 中手动分配委托。特别是,通过了解 Object 在 Storyboard 中的工作方式。

我知道我可以通过检查 UITableView 的父母来区分它们。但是将逻辑分成不同的对象总是好的。它将更容易实现,效率更高,结构更好,并且可以重用。

提前致谢。

我的尝试

  • 在情节提要中将ObjectUITableViewController 放在同一级别(您不能将Object 放在另一个UIViewController 中)。
    将其与UITableViewController 中的@property (nonatomic, weak) IBOutlet NSObject * 链接。
    当我在viewDidLoad 中打印NSObject * 时,它原来是nil 指针。没运气。
  • 通过将属性更改为@property (nonatomic, strong),它变为UICustomObject,而不是nil。看来我在正确的轨道上。

【问题讨论】:

  • Object 用于为您的自定义类及其输入和出口提供一个 Interface Builder 链接。
  • 我想我明白了。试图玩弄。感谢您的评论。

标签: objective-c xcode4.2 storyboard nsobject


【解决方案1】:

正如您所注意到的,Object 使它成为任何类的对象,包括您自己的自定义类,在加载 XIB/Storyboard 时被实例化。您获得 UICustomObject 的事实表明 XIB/Storyboard 加载机制不知道该对象应该是什么类,或者找不到您指定的类(通过运行时查找)。

解决方案是确保在自定义类检查器中为 Object 指定正确的类:

当然,您还需要确保相关类的实现文件在您的项目中并且包含在您的目标中。

最后,将strong 用于指向您的自定义对象的IBOutlet 是正确的,因为它是顶级对象,并且应该使用strong 属性来引用顶级对象。 (如果你真的很好奇,Mike Ash 有一个很好的article 关于 XIB/Storyboard 出口内存管理的细节,包括 OS X 和 iOS 在这方面的差异。)

【讨论】:

  • 感谢您的精彩解释。除此之外,我还发现了一些有趣的事实。 1. 由于该对象是由 Storyboard 在运行时创建的,因此无法为初始化程序指定任何参数。 2.对象本身不能连接到segue或调用segue,它必须调用主视图控制器。
  • 亲爱的@AndrewMadsen,你可能知道这个问题的答案..stackoverflow.com/q/26043973/294884 ...我认为这与这些神秘的“对象”对象有关!!干杯...
【解决方案2】:

此问题已标记为已回答,但由于它是一个可以有多个答案的开放式问题,因此有一种巧妙的技术可以按照您的说法进行操作 - 将功能分解为作者所指的单个角色类“行为”:

http://www.objc.io/issue-13/behaviors.html

它的要点是,您可以编写一个对象,例如通过将插座暴露给多个视图来执行视差效果。它被设置为滚动视图委托,并根据可配置的设置更新其他视图。正如您所指出的,您不能将参数传递给构造函数,但您仍然可以通过@Andrew 的答案中的图像中所示的关键路径机制指定参数。

正如您还指出的那样,您可能会遇到这样的问题:您希望让不同的对象响应滚动事件等。作者通过编写一个简单的多路复用器来解决这个问题。您也可以使用责任链模式解决此问题:http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

最后,@Andrew 在他的回答中提到了将对象存储为强属性的重要性。他们是上述文章的作者——让我们称他为“Krzysztof”,提供了一种使用 obj-c 关联对象机制的解决方案,以允许无需代码即可进行配置。你可能会很喜欢这个,而且现在使用 Swift 可能会有更好的选择,但至少,它是一些值得思考的好东西。

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2016-01-14
    • 2011-11-18
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多