在Objective-C中,我有一个类的类别:
@interface UILabel(CustomInit)
- (id)initWithCoder:(NSCoder *)coder;
@end
我正在做的是编写一个自定义初始化函数来执行一些额外的操作,而我想做的是,在这个自定义初始化函数中,调用UILabel的基本initWithCoder。这可能吗?怎么样?
修改的
感谢。好的,所以我的计划没有实际意义。不能只是重载initWithCoder。有没有办法实现相同的功能(所有UILabel获得这个添加的初始化步骤)而不会重载initWithCoder?或者也许是UILabel的initWithCoder的示例代码,我可以用添加的代码重写它?
修改的
好的,所以要清楚我正在尝试的事情:
Can I embed a custom font in an iPhone application?
有一个答案,其中有人使用私人GraphicServices函数GSFontAddFromFile手动在iphone上添加自定义字体。我尝试了这个代码,它非常适合手动设置标签的字体。但是,如果您尝试在Interface Builder中设置字体,它无法正确加载,它只是下拉到系统字体。我想要做的是手动加载字体并使用IB中选择的字体自动设置标签的字体。这样我就不需要为我放下的每个标签打造一个插座。我也没有必要编写一个荒谬的标签子类(也在该线程中提出并进行了大量的自定义绘图),我发现它非常怪诞。现在我仍然可以为我的所有标签创建一个子类,但是在其他UI对象中就是嵌入标签的情况,即UIButtons。我希望嵌入式标签也不会被破坏。
任何建议都会很棒。感谢。
答案 0 :(得分:13)
当某个类别覆盖继承时 方法,类别中的方法 像往常一样,可以调用继承的 通过消息实现到超级。 但是,如果某个类别覆盖了 方法已经存在于 类别的类,没有办法 调用原始实现。
答案 1 :(得分:1)
你们对此感觉如何?
在运行时获取initWithCoder的原始方法地址并将其存储在静态变量中。做一个方法混杂在它上面用我的initWithCoder替换类实现。然后在我的initWithCoder中,我将调用存储在静态变量中的原始方法。
你可以把它放在一个类别中,并在程序开始时调用这个类初始化步骤,确保它不能被调用两次,或者它是什么也不做。
这似乎很危险,但我觉得它应该有用。
答案 2 :(得分:1)
方法调整应该像kidnamedlox建议的那样工作。
Evan Doll在这个stanford itunes课程中讨论了完全相同的问题