objective c - NSTableView 重新加载数据
objective c - NSTableView Reload Data
我正在开发一个与 tableview 配合使用的应用程序。我需要将大量数据加载到我的 table 视图中(最多 500k 个元素)。当我加载数据时,我在另一个视图上显示动画。动画在主线程中运行。加载数据在后台线程上。我也在后台线程的 table 视图中执行重新加载数据。但我想让取消这个操作成为可能。
我注意到获取数据需要几秒钟,而将此数据加载到 table 视图可能需要几分钟。所以,我的问题是:有没有办法中断将数据加载到 table 视图中?我已阅读 table 查看文档中的编程指南,但没有找到任何关于此类内容的信息。
我的目标SDK是10.6。我使用基于单元格的 tableview
您可以通过页面限制和页面偏移值使用加载更多功能。
例如,您在参数中发送页面限制 20,页面偏移量将为 0。
然后 table 视图中有 20 个数据加载。
添加负载更多 functionality.when 用户向下滚动或向上滚动超过 20 个数据然后它将调用。
然后页面偏移量将增加到 1,页面限制将是 20 到 40。
我有一个适合我的解决方案。所以,我所做的是向 NSTableView 添加一个类别 属性: lastRowVisible。我以这种方式覆盖了它的 getter:
- (BOOL)isLastRowVisible
{
NSRect bounds = self.superview.bounds;
bounds.origin.y += bounds.size.height - 1;
NSInteger index = [self rowAtPoint:bounds.origin];
return index == ([self.dataSource numberOfRowsInTableView:self] - 1);
}
在我的 viewController 中,我添加了一些属性:
@property (nonatomic, assign, readwrite) NSInteger pageNumber;
@property (nonatomic, assign, readwrite) NSInteger pageLimit;
@property (nonatomic, assign, readwrite) BOOL canLoadMoreData;
当我需要将数据加载到 tableView 中时,我会进行这样的操作:
self.pageLimit = kDefaultPageLimit;
self.pageNumber = kDefaultPageNumber;
NSInteger visibleNumberOfRows = (self.pageNumber + 1) * self.pageLimit;
self.myDataArray = DataArray;
self.canLoadMoreData = (self.myDataArray.count < visibleNumberOfRows);
[self.myTableView reloadData];
[self.myTableView scrollRowToVisible:0];
在我的委托方法中,我只检查是否需要加载更多数据:
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
return self.myData.count < self.visibleNumberOfRows ? self.myData.count : self.visibleNumberOfRows;
}
- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
if (tableView.lastRowVisible && self.canLoadMoreData)
{
self.pageNumber ++;
if (self.myData.count < self.visibleNumberOfRows)
{
self.canLoadMoreData = NO;
}
[tableView reloadData];
}
// configure and return cell
}
这样的解决方案很适合我,满足我的所有需求。
我正在开发一个与 tableview 配合使用的应用程序。我需要将大量数据加载到我的 table 视图中(最多 500k 个元素)。当我加载数据时,我在另一个视图上显示动画。动画在主线程中运行。加载数据在后台线程上。我也在后台线程的 table 视图中执行重新加载数据。但我想让取消这个操作成为可能。
我注意到获取数据需要几秒钟,而将此数据加载到 table 视图可能需要几分钟。所以,我的问题是:有没有办法中断将数据加载到 table 视图中?我已阅读 table 查看文档中的编程指南,但没有找到任何关于此类内容的信息。
我的目标SDK是10.6。我使用基于单元格的 tableview
您可以通过页面限制和页面偏移值使用加载更多功能。 例如,您在参数中发送页面限制 20,页面偏移量将为 0。 然后 table 视图中有 20 个数据加载。 添加负载更多 functionality.when 用户向下滚动或向上滚动超过 20 个数据然后它将调用。 然后页面偏移量将增加到 1,页面限制将是 20 到 40。
我有一个适合我的解决方案。所以,我所做的是向 NSTableView 添加一个类别 属性: lastRowVisible。我以这种方式覆盖了它的 getter:
- (BOOL)isLastRowVisible
{
NSRect bounds = self.superview.bounds;
bounds.origin.y += bounds.size.height - 1;
NSInteger index = [self rowAtPoint:bounds.origin];
return index == ([self.dataSource numberOfRowsInTableView:self] - 1);
}
在我的 viewController 中,我添加了一些属性:
@property (nonatomic, assign, readwrite) NSInteger pageNumber;
@property (nonatomic, assign, readwrite) NSInteger pageLimit;
@property (nonatomic, assign, readwrite) BOOL canLoadMoreData;
当我需要将数据加载到 tableView 中时,我会进行这样的操作:
self.pageLimit = kDefaultPageLimit;
self.pageNumber = kDefaultPageNumber;
NSInteger visibleNumberOfRows = (self.pageNumber + 1) * self.pageLimit;
self.myDataArray = DataArray;
self.canLoadMoreData = (self.myDataArray.count < visibleNumberOfRows);
[self.myTableView reloadData];
[self.myTableView scrollRowToVisible:0];
在我的委托方法中,我只检查是否需要加载更多数据:
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
return self.myData.count < self.visibleNumberOfRows ? self.myData.count : self.visibleNumberOfRows;
}
- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
if (tableView.lastRowVisible && self.canLoadMoreData)
{
self.pageNumber ++;
if (self.myData.count < self.visibleNumberOfRows)
{
self.canLoadMoreData = NO;
}
[tableView reloadData];
}
// configure and return cell
}
这样的解决方案很适合我,满足我的所有需求。