ios - 继承和扩展框架类的问题

标签 ios objective-c

我有一个继承UIView的自定义类C,在其中定义了一些常用方法。

现在我想要一个 UITextView 对象 A 和一个 UIView 对象 B 具有这些方法。对于B,我只需要将他的父亲改为C即可。

但是我应该对A做什么呢?我不能直接将其父更改为 C,否则我将丢失 UITextView 的方法。

而且我不能(也不想)使用类别,因为在 C 中我有一些属性和成员变量。

最佳答案

多重继承不是 Objective-C 的特性。充其量,您可以让 UITextView 子类和 UIView 子类都实现一个通用协议(protocol)。当然,这意味着您将不得不复制代码。

我相信您可以通过类别实现您想要的效果。您可以在运行时利用 objc/runtime.h 添加属性(借自 NSHipster )

#import "UIView+MyView.h"
#import <objc/runtime.h>

static const void *IndieBandNameKey = &IndieBandNameKey;    

@implementation UIView (MyView)
@dynamic indieBandName;

- (NSString *)indieBandName {
    return objc_getAssociatedObject(self, IndieBandNameKey);
}

- (void)setIndieBandName:(NSString *)indieBandName {
    objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

因为 UITextView 是 UIView 的子类,所以您放入 UIView 类别的方法将应用于您的 UIView 子类以及 UITextView 子类。此外,您还可以在您的类别方法中访问这些动态创建的属性,从而允许您利用您现在声明的那些“成员变量”。

关于ios - 继承和扩展框架类的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20110967/

相关文章:

ios - 带有 TableView 的导航 Controller

ios - UIImage 在 iOS 中使用时看起来不同

objective-c - 什么是分组模式下 UITableView 的良好数据结构

iphone - 更改 UIView 的 CALayer 框架(self.view.layer.frame = ...)似乎没有效果

ios - UIBarButton的标题位置

iphone - 使用 FBConnect iphone 登录 Facebook 后出现白屏

ios - Xcode 7 : exception breakpoint firing in `main.m` , 但应用运行正常

ios - 在 UITextView 中选择特定文本以触发 segue

ios - NSDate 月和星期本地化

objective-c - 调用时 UITableView 部分不重新加载