【问题标题】:How can Interface Builder interact with private IBOutlet?Interface Builder 如何与私有 IBOutlet 交互?
【发布时间】:2014-10-05 05:38:06
【问题描述】:
我看到 IB 的工作是解压 Nib 文件,加载 Nib 中的对象并将其设置为 IBOutlet 属性。有些人甚至use IB as DI framework
但是 IBOutlet 可以是私有的,我的意思是它可以在类扩展或实现部分中声明。那么IB如何与这些私有的IBOutlet交互呢?
@interface FPMovieBottomViewController ()
@property (weak, nonatomic) IBOutlet UILabel *usernameLabel;
@end
【问题讨论】:
标签:
ios
dependency-injection
interface-builder
private
iboutlet
【解决方案1】:
如注意中所述:Customizing Existing Classes
通过添加上面显示的类扩展,重新声明
uniqueIdentifier 属性作为读写属性,一个
setUniqueIdentifier:方法将在运行时存在于每个 XYZPerson
对象,无论其他源代码文件是否知道
类扩展与否。
如果其中一个源代码文件中的代码尝试调用私有方法或设置只读属性,编译器会报错,但可以避免编译器错误并利用动态运行时特性在其他源代码文件中调用这些方法方法,例如使用 NSObject 提供的 performSelector:... 方法之一。
您应该避免使用此类层次结构或设计
有必要的;相反,主类接口应始终
定义正确的“公共”交互。
如果您打算使“私有”方法或属性可用于选择其他类,
比如框架内的相关类,可以声明类
在单独的头文件中扩展名并将其导入源文件中
需要它。一个类有两个头文件并不少见,
例如,例如 XYZPerson.h 和 XYZPersonPrivate.h。当你
释放框架,你只释放公共的 XYZPerson.h 头文件
文件。
我已经强调了我们可以使用动态运行时修改现有类的部分。在 ruby 或 python 等其他语言中,这称为 monkey-patching。
有一篇关于此的好文章:monkeypatching-for-humans。但是,在给出的示例中,扩展只允许向现有类添加功能,而不是 replace、remove 或 override。在 objc 中,猴子修补的一个准确示例是方法调配。这并不总是有害的,因为开发人员一直在利用它来构建像 Xcode 插件或 mogenerator 这样的东西。