12

简短的问题

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

具体来说,它是NSObjectStoryboard(或 xib)中的一个。它的描述如下:

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

长问题

我正在尝试构建一个UITableViewController和一个UISearchController。由于他们都需要在他们的委托中实现UITableViewDelegateand UITableViewDatasource,我希望我可以将委托分配给UISearchControllerMain 以外的 Object UITableViewController

我正在寻找一种在 Storyboard 中实现此目的的方法,而不是在viewDidLoad. 特别是,通过弄清楚ObjectStoryboard 中的工作方式。

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

提前致谢。

我试过的

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

2 回答 2

9

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

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

在此处输入图像描述

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

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

于 2012-07-22T03:32:31.237 回答
5

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

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

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

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

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

于 2014-10-13T18:40:05.750 回答