Mac OSX:为NSTableView加载更多数据的最佳分页方法是什么?

时间:2015-09-03 17:23:58

标签: objective-c macos cocoa pagination nstableview

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

P.S。如果你提供的视觉和代码示例让我能够更好地理解,我将不胜感激。

编辑:我在互联网上看到这段代码。我想我可以实现类似的东西一次加载一些数据。获取数据可以获取每个页面的下一个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

1 个答案:

答案 0 :(得分:0)

其他人已经投票并投票决定关闭这个问题,因为它(实际上)有点过于含糊。您似乎还在询问两个不同的事情:1)如何对数据源进行分页,以便表格一次只显示一页数据,以及2)如何在用户界面中处理此数据。

为了回答您的分页问题,​​您需要提供有关数据性质的更多信息,为什么您认为需要对其进行分页,以及它来自何处(即,它是如何进入你的数据源的)等等。

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

例如,&#34;自上而下拉动以刷新&#34;可能只是重新加载数据,而不是附加到它(这不是真的用于&#34;分页&#34;,只是&#34;更新信息&#34;)。但是,这可以用作加载&#34;前一页&#34;值得的数据。拉得足够硬,然后移动到上一页(用户发现自己位于上一页的底部)。到达最后并且足够努力并且加载下一页(用户发现自己位于下一页的滚动列表的顶部)。有很多开源示例(搜索Github),向您展示如何在Mac上进行pull-to-refresh。这很容易适应这个目的。

另一个例子是添加&#34;加载next / prev x&#34;在需要时进入数据源的顶部和底部。显然,第一页不会加载前一个x&#34;并且最后一页没有&#34;加载下一个x&#34;条目,因为你在开始/结束。如果你的页面大小&#34;是100行,你有100多行总数据,然后你的第一页将总共有101行(但最后一页是一个按钮,表示&#34;再加载100行......&#34;)。单击最后一行的行为与我之前给出的示例相同。如果你在&#34;中间&#34; (你可以加载100 prev和100 next),你的表有102行(第一个和最后一个是导航控件);如果在最后,返回101,但导航按钮是表格中的第一行。

另一个例子可能是完全消除这种情况并在工具栏中有一个页面控件,可能是带有first / prev / position的分段控件,next,last按钮如下:[|&lt; &LT; (101-200)&gt; &GT; | ] ...位置段(显示页面的范围)可以是可点击的,允许您通过输入来指定页面大小和/或直接跳转到页面。

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

我希望这会有所帮助。