故事板对象库中的"对象"可以做什么?

Gre*_*ang 11 objective-c storyboard nsobject xcode4.2

简短的问题

Object在XCode的界面构建器的对象库中有一个调用的东西.我想知道使用这个"对象"可以实现什么样的任务.

具体来说,它是一个NSObject故事板(或xib).它描述如下:

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

长问题

我正在努力建立UITableViewController一个UISearchController.由于它们都需要在其委托中实现UITableViewDelegateUITableViewDatasource,我希望我可以将委托分配给UISearchController除Main之外的Object UITableViewController.

我正在寻找一种在Storyboard中实现此目的的方法,而不是手动分配代理viewDidLoad.特别是,通过弄清楚如何Object在Storyboard中工作.

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

提前致谢.

我试过了什么

  • 放在故事板Object中的同一级别UITableViewController(你不能把它Object放在另一个UIViewController).
    将它链接@property (nonatomic, weak) IBOutlet NSObject *UITableViewController.
    NSObject *结果是一个nil指针,当我在打印出来viewDidLoad.没运气.
  • 通过将属性更改为@property (nonatomic, strong),它将成为一个UICustomObject而不是nil.似乎我走在正确的轨道上.

And*_*sen 9

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

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

在此输入图像描述

当然,您还需要确保所讨论的类的实现文件位于您的项目中并包含在您的目标中.

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


Chr*_*ver 5

这个问题已被标记为已回答,但由于这是一个可以有多个答案的开放式问题,因此您可以使用一种聪明的技巧 - 将功能分解为单个角色类,作者称之为"行为" :

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

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

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

最后,@ Andrew在他的回答中提到了将对象存储为强大属性的重要性.他们是上述文章的作者 - 让我们称他为"Krzysztof",使用obj-c相关对象机制提供一种解决方案,以便在没有代码的情况下实现可配置性.你的里程可能非常有用,现在Swift可能有更好的选择,但至少,这是一些很好的思考.