【问题标题】:Mac OSX: What is the best pagination method to load more data for NSTableView?Mac OSX:为 NSTableView 加载更多数据的最佳分页方法是什么?
【发布时间】:2015-09-03 17:23:58
【问题描述】:

我正在尝试找到一种方法来允许我在 NSTableView 中加载更多数据,以便用户可以看到他的所有数据。但是,我只习惯于 iOS 开发而不是 Mac OSX 开发。 iOS 有一种方法可以让您下拉 UITableView 以加载更多数据。 Mac OSX 开发有这样的方法还是有更好的选择?我听说过使用“页面”来实现这一点,但我不知道这是否是最好的方法。我用谷歌搜索这个,但一直给我 iOS 结果。

附:如果您提供视觉和代码示例,我将不胜感激,以便我更好地理解。

编辑:我在互联网上看到了这段代码。我想我可以实现这样的东西来一次加载少量数据。 Fetch data 可以抓取每页的下 100 个数据。

@interface ViewController : NSObject {
    NSTableView *tableView;
    NSMutableArray *mDataSource;
    NSInteger mPageNumber;
    NSInteger mTotalPage;
}
-(IBAction)nextPage : (id)sender;//for next page
-(IBAction)prevPage : (id)sender;// for prev. page
-(void)fetchData;
@property (assign) IBOutlet NSTableView *tableView;
@end
#import "ViewController.h"


@implementation ViewController
@synthesize tableView;
- (id) init
{
    self = [super init];
    if (self != nil) {
        mDataSource = [[NSMutableArray alloc] init];
        mPageNumber=0;
        mTotalPage =2;// total numer of pages
        [self fetchData];
    }
    return self;
}


-(IBAction)nextPage : (id)sender;
{
    ++mPageNumber;
    if (mTotalPage<=mPageNumber) {
        mPageNumber=0;// point to first page
    }
    [self fetchData];

}
-(IBAction)prevPage : (id)sender;
{
    --mPageNumber;
    [self fetchData];
}

-(void)fetchData;
{
    [tableView setDataSource:nil];
    NSString *lDataSourcePath = [[NSString alloc] initWithFormat:@"/page%d",mPageNumber];
    NSArray *lDataSource = [[NSArray alloc] initWithContentsOfFile:lDataSourcePath];
    [mDataSource setArray:lDataSource];
    [lDataSource release];
    [lDataSourcePath release];
    [tableView setDataSource:self];
    [tableView reloadData];
}
-(void)dealloc
{
    [mDataSource release];
    [super dealloc];
}

#pragma mark Data Source
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
    return [mDataSource count];
}

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
    return [mDataSource objectAtIndex:rowIndex];
}

@end

【问题讨论】:

标签: objective-c macos cocoa pagination nstableview


【解决方案1】:

其他人投了反对票并投票结束了这个问题,因为它(真的)有点太模糊了。您似乎也在询问两件不同的事情:1)如何对数据源进行分页,以便表格一次只显示一页数据,以及 2)如何在用户界面中处理这个问题。

为了回答您的分页问题,​​您需要提供更多关于数据性质、您认为需要对其进行分页的原因、数据的来源(即,它是如何进入您的数据源)等

为了回答您的 UI 问题,我们需要更多地了解您的数据代表什么以及用户应该如何使用它,因为有几种不同的方法。

例如,“拉自上而下刷新”可能只是重新加载数据,而不是附加到它(这不是真正的“分页”,只是“更新信息”)。但是,这可以用作加载“上一页”数据的一种方式。用力拉,它会移动到上一页(用户发现自己在前一页的底部)。走到尽头,用力拉,加载下一页(用户发现自己位于下一页滚动列表的顶部)。有几十个开源示例(搜索 Github)向您展示如何在 Mac 上进行下拉刷新。这可以很容易地适应这个目的。

另一个示例是在需要时将“load next/prev x”条目添加到数据源的顶部和底部。显然第一页不会有“加载上一个 x”,最后一页不会有“加载下一个 x”条目,因为你在开始/结束。如果您的“页面大小”是 100 行并且您有 100 多行总数据,那么您的第一页将包含 101 行(但最后一个是一个显示“再加载 100 行...”的按钮)。单击最后一行的行为类似于我之前给出的示例。如果您在“中间”(您可以加载 100 个上一个和 100 个下一个),您的表格将有 102 行(第一个和最后一个是导航控件);如果在最后,返回 101,但导航按钮是表格中的第一行。

另一个例子可能是完全消除这一点,并在工具栏中有一个页面控件,可能是一个带有第一个/上一个/位置,下一个,最后一个按钮的分段控件,如下所示:[ | >| ] ...位置段(显示页面范围)可以是可点击的,并允许您指定页面大小和/或通过输入直接跳转到页面。

以上示例说明了为什么您的问题过于模糊而无法回答。我鼓励你为你的 UI 部分提出一个新问题(关于数据的性质和你的用户将用它做什么等非常具体的细节)。如有必要,针对如何构建允许数据分页的自定义数据源提出一个单独的问题。同样,正如我上面提到的,对数据的性质、数据的来源等要非常具体。如果没有这些信息,您将只能得到模糊的答案(尽管对模糊问题的更具体的答案意味着回答者做出了一些假设,最终可能会让您更加困惑)。所以总是要具体。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2017-06-24
    相关资源
    最近更新 更多