在我的故事板中,我有一个简单的视图控制器,里面包含一个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;
}
这里的问题是当我在dataSource/delegate = self
期间尝试在我的子类中设置initWithCoder
时(由故事板设置调用),然后它对导致其余的UITableView方法无效被称为(eg. (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath)
但是如果我在主VC中设置dataSource/delegate
指针( SceneFormVC.m ),那么UITableView就会按预期工作。
@implementation SceneFormVC
- (void)viewDidLoad
{
[super viewDidLoad];
self.sceneFormTable.dataSource = self.sceneFormTable;
self.sceneFormTable.delegate = self.sceneFormTable;
我不太明白为什么我的SceneFormTV
子类在内部使用完全相同的dataSource/delegate
指针时无法操作?
答案 0 :(得分:1)
这个最初的目标是IBOutlets,但在你的情况下也应该有效。
调用initWithCoder时,对象尚不存在,并且在调用viewDidLoad时它们也存在。通过使用类似:
之类的方法注销worldView的值来检查initWithCoder方法
NSLog(@"%@", self.datasource);
它将是零。它们将在调用viewDidLoad之前初始化,因此您可以在那里设置它们。
来源:Objective-C iOS Development Using viewDidLoad or initWithCoder when setting Variables and Why?