从外面我希望我的班级能够像这样出现
@interface MYCardGroupView : UIView
@property (nonatomic, strong) NSArray *cardObjects;
@end
但是在类本身中我希望它实际上是一个UITableView
@interface MYCardGroupView : UITableView <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) NSArray *cardObjects;
@end
参数:
答案 0 :(得分:4)
(我猜想,人们不得不担心ARC。可能会感到不安。)
答案 1 :(得分:2)
您可以通过将它们添加到.m文件中的类扩展名来隐藏它实现的协议(如UITableViewDataSource
和UITableViewDelegate
)。但你无法隐藏它是一个UITableView子类。
然而,有一个额外的UIView不应该损害性能,至少不是以任何明显的方式。在内置的UIKit元素中,您没有注意到额外的视图,影响可能非常小。如果您担心性能,请将其保留为UITableView子类。但是如果你不是那么担心而且你更关心隐藏的东西,那就把它变成一个UIView子类,让它封装一个UITableView。
答案 2 :(得分:2)
您可以在标头之外声明协议(通过类扩展 - 未命名的类别),但技术上不是继承。那是因为通常你想要知道继承。
立即明显的解决方法包括:
UIView
的子类的公共类,使其init
或alloc
替换另一个类的实例,否则该实例遵循相同的已发布接口但是{ {1}};和class_setSuperclass
(从第一天开始弃用但仍然可用)在UITableViewController
更改您的超类。答案 3 :(得分:1)
你所追求的实际上是一个类集群,集群大小为1 - 不寻常但可能非常合法。
标准框架中的许多类;例如NSString
;实现为 clusters ,其中公共类是“抽象”(不是传统的OO意义),一个或多个私有类提供实际的实现。在创建公共类的实例时,其init
(或alloc
)替换其中一个私有类的实例。
这是Cocoa中定义良好的模型,请参阅Apple的Cocoa Core Competencies: Class Cluster
答案 4 :(得分:0)
这从功能角度来看,但有以下缺点
+[MYCardGroupView alloc]
:Incompatible pointer types returning 'MYPrivateCardGroupView *' from a function with result type 'MYCardGroupView *'
@interface MYCardGroupView : UIView
@property (nonatomic, strong) NSArray *cardObjects;
@end
#import "MYCardGroupView.h"
@interface MYPrivateCardGroupView : UITableView <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) NSArray *cardObjects;
@end
@implementation MYCardGroupView
+ (id)alloc
{
return [MYPrivateCardGroupView alloc];
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
NSLog(@"My class is %@", [self class]);
}
return self;
}
@end
@implementation MYPrivateCardGroupView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
NSLog(@"My class is %@", [self class]);
}
return self;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 10;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
cell.textLabel.text = @"hello";
return cell;
}
@end
My class is MYPrivateCardGroupView