【发布时间】:2014-09-21 15:37:18
【问题描述】:
在我的故事板中,我有一个简单的视图控制器,其中包含一个 UITableView。
SceneFormVC.m
@property (nonatomic, strong) IBOutlet SceneFormTV *sceneFormTable;
在改进我的 MVC 和制作“更轻”的 VC 的过程中,我将 UITableView 子类化以更好地分离关注点和代码重用。
SceneFormTV.h
@interface SceneFormTV : UITableView <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate>
SceneFormTV.m
@implementation SceneFormTV
- (id)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self)
{
self.dataSource = self;
self.delegate = self;
}
return self;
}
这里的问题是当我尝试在initWithCoder 期间在我的子类中设置dataSource/delegate = self(由情节提要设置调用)时,它不会导致调用其余的 UITableView 方法@987654327 @
但如果我在主 VC (SceneFormVC.m) 中设置 dataSource/delegate 指针,那么 UITableView 将按预期工作。
@implementation SceneFormVC
- (void)viewDidLoad
{
[super viewDidLoad];
self.sceneFormTable.dataSource = self.sceneFormTable;
self.sceneFormTable.delegate = self.sceneFormTable;
我不太明白为什么我的SceneFormTV 子类在内部使用完全相同的dataSource/delegate 指针设置自身时无法运行?
【问题讨论】:
-
我不知道为什么这不起作用,但是将表作为自己的数据源并不是好的 MVC 设计。表(MVC 中的 V)不应该知道任何关于模型的信息,而数据源显然知道。如果你想做一个更轻量的视图控制器,你可以创建一个单独的类(NSObject 子类)作为数据源。
-
我很可能仍会进一步分离数据源组件。但现在希望它远离 VC 文件,以促进模块化和其他 VC 的重用。仅供参考:我正在使用 UITableView 构建表单引擎。
标签: ios objective-c uitableview datasource