【问题标题】:Setting UITableViewDataSource within UITableView subclass has no effect在 UITableView 子类中设置 UITableViewDataSource 无效
【发布时间】: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


【解决方案1】:

这个最初针对 IBOutlets,但在您的情况下也应该有效。

在调用 initWithCoder 时对象还不存在,而在调用 viewDidLoad 时它们存在。通过使用以下方式注销 worldView 的值来检查您的 initWithCoder 方法:

NSLog(@"%@", self.datasource);

它将为零。它们将在调用 viewDidLoad 之前被初始化,因此您可以在那里设置它们。

来源:Objective-C iOS Development Using viewDidLoad or initWithCoder when setting Variables and Why?

【讨论】:

  • 我害怕那个。那么在子类中正确设置这些属性可能存在哪些其他选项? awakeFromNib?
  • 是的,我认为 awakeFromNib 会解决您的问题。如您所见,UIKit 不支持 MVC 模式以外的其他模式。
  • 我会亲自在 viewDidLoad 中设置。
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多