UITableView:以编程方式设置数据源

Posted

技术标签:

【中文标题】UITableView:以编程方式设置数据源【英文标题】:UITableView: programmatically set the data source 【发布时间】:2011-03-23 05:39:53 【问题描述】:

在我的 iPhone 应用程序中,我有一个 UIViewController,它有一个 UITableView 和另一个 UIView,在它的 xib 文件中,xib 的视图包含 UITableView 和另一个 UIView。两个视图都作为 IBOutlets 链接到 xib 文件中的适当视图。 当我想以编程方式为 UITableView 设置数据源时,我在 UIViewController 中创建了一个这样的方法:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil tableDataSource:(id)dataSource
if ((self = [self initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    // Custom initialization
    self.inventoryTableView.dataSource = dataSource;
    //[self.inventoryTableView reloadData];

return self;

然后我在我的另一个类中实现以下方法,我们称之为B:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

最后我 alloc+init B 并将实例传递给方法 initWithNibName:bundle:tableDataSource: 创建 UIViewController。所有视图都出现在模拟器中,但数据源方法似乎没有被调用。 我对另一个控制器做了类似的事情并且可以工作,但它是一个 UITableViewController 而 TableView 是控制器的视图。是否有可能作为一个子视图,我必须在不同于 initWithNib 的另一种方法中设置数据源?

更新: 通过将数据源分配放在viewDidLoad: 方法中,我能够解决它。在我看来,即使在调用 [self initWithNibName:nibNameOrNil bundle:nibBundleOrNil] 之后,主视图的子视图也没有正确启动

【问题讨论】:

【参考方案1】:

看看这个答案,我认为它类似于您提出的使用“B”作为控制器的外部数据源的建议。

Simple way to separate UITableview datasource and delegate from main UIViewController class?

【讨论】:

我读过它和里面的链接。我不想从 IB 传递(并让它分离我的数据源类)我只想以编程方式完成它(我已经为帖子中所说的另一种类似情况做了)。 我似乎通过在viewDidLoad:方法中设置数据源来解决它。但我仍然不明白为什么它适用于其他类【参考方案2】:

正如更新和评论中所说,我通过更改设置委托/数据源的位置来解决,因为有必要等待 tableView 被分配和初始化。在我看来,作为子视图,它的分配/初始化晚于类的主视图

【讨论】:

你能发布你的 viewDidLoad 方法吗?我正在尝试做与您相同的事情,但是在 viewDidLoad 方法中您将 self.table.dataSource 设置为什么?在上面的代码中,您可以将其设置为 init 方法中可用的 dataSource

以上是关于UITableView:以编程方式设置数据源的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式设置 UITableView 部分标题(iPhone/iPad)?

以编程方式为 UITableView 和 UISearchBar 设置 NSLayoutConstraints

如何以编程方式设置 UITableView 标头的约束以支持 RTL 和 LTR?

iOS UITableView 在设置 TableHeaderView 后以编程方式覆盖自动布局约束

在 iOS 中以编程方式对 UITableView 的约束

以编程方式创建 UITableView