繁体   English   中英

Interface Builder如何与私有IBOutlet交互?

[英]How can Interface Builder interact with private IBOutlet?

我看到IB的工作是取消存档Nib文件,在Nib中加载对象并将其设置为IBOutlet属性。 甚至有人将IB用作DI框架

但是IBOutlet可以是私有的,我的意思是可以在类扩展或实现部分中声明它。 那么IB如何与这些私有IBOutlet进行交互?

@interface FPMovieBottomViewController ()

@property (weak, nonatomic) IBOutlet UILabel *usernameLabel;

@end

如此处的注释中所述: 自定义现有类

通过添加上面显示的类扩展,将uniqueIdentifier属性重新声明为readwrite属性,setUniqueIdentifier:方法将在运行时在每个XYZPerson对象上存在,而不管其他源代码文件是否知道该类扩展。

如果其他源代码文件之一中的代码尝试调用私有方法或设置只读属性, 编译器会抱怨,但是可以避免编译器错误并利用动态运行时功能以其他方式(例如通过使用由NSObject提供的performSelector:...方法之一。 在必要时,应避免使用类层次结构或设计; 相反,主要类接口应始终定义正确的“公共”交互。

如果打算使“私有”方法或属性可用于选择其他类,例如框架中的相关类,则可以在单独的头文件中声明类扩展,并将其导入需要它的源文件中。 一个类有两个头文件很常见,例如,XYZPerson.h和XYZPersonPrivate.h。 发布框架时,仅发布公共XYZPerson.h头文件。

我已经重点介绍了可以通过动态运行时修改现有类的部分。 在其他语言(如ruby或python)中,这被称为Monkey-patching

关于这一点,有一篇很好的文章:“ 为人类猴子修补” 但是,在给定的示例中,扩展只允许将功能添加到现有类中,而不能替换移除覆盖 在objc中,猴子修补的准确示例是方法混乱。 这并不总是有害的,因为开发人员一直在利用它来构建Xcode插件或mogenerator之类的东西

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM