ipad如何在一个视图上以编程方式创建多个表

时间:2011-11-09 14:03:31

标签: ios ipad uitableview

我需要创建一个iPad应用程序,我必须在一个视图中显示多个表(没有网格,只有1个多列的列)。这必须以编程方式完成,因为在后台办公室有人会设置这个数量的表。

视图将有一个滚动,所以我可以看到所有这些。

这可以做得好吗?

有人可以提供我的一些代码或链接到一些教程,关于如何在一个视图中创建N个表,随时随地定位它们。

4 个答案:

答案 0 :(得分:2)

这绝对可以做到。

最简单的方法可能是创建UITableView的子类,这样您创建的每个TableView都可以为其委托和数据源创建一个唯一的处理程序,ala:

DynamicTableView.h

@interface DynamicTableView : UITableView <UITableViewDelegate, UITableViewDataSource> {
    NSMutableArray *items;
}

@end

DynamicTableView.m

#import "DynamicTableView.h"

@implementation DynamicTableView

-(id) initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
    if (self == [super initWithFrame:frame style:style]) {
        items = [[NSMutableArray alloc] initWithObjects:[NSString stringWithFormat:@"%i", [NSDate timeIntervalSinceReferenceDate]],
                 [NSString stringWithFormat:@"%i", [NSDate timeIntervalSinceReferenceDate]], nil];
    }

    return self;
}

-(void) dealloc {
    [items release];

    [super dealloc];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [items count];
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.text = [items objectAtIndex:indexPath.row];

    return cell;
}

@end

这是一个非常简单的实现,当它初始化时,用两个时间戳填充其数据源(items数组)。使用它就像下面这样简单:

for (int i = 0; i < 4; i++) {
    DynamicTableView *table = [[[DynamicTableView alloc] initWithFrame:CGRectMake(10, (i * 100) + 10, 200, 50) style:UITableViewStylePlain] autorelease];
    [table setDelegate:table];
    [table setDataSource:table];

    [self.view addSubview:table];
}

修改DynamicTableView以接受您想要的任何数据源及其显示方式。

希望有所帮助!

答案 1 :(得分:0)

根据你的描述,我假设你想拥有一个任意数量的表,所有表都坐在一个本身可以滚动的视图上(这样你就可以向上或向下滚动来到达所有的表)。这在iOS中是非常不可取的,因为表视图本身是可滚动视图的子类,并且您将遇到主要问题,使各个表与“主”可滚动视图一起正确滚动。

假设您正在尝试这样做,那么使用分成多个部分的单个表视图会更好。以下是a good tutorial,其中显示了如何执行此操作。

答案 2 :(得分:0)

我希望下一个代码可以成为你的起点:

@interface MyController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, retain) UITableView *table1;
@property (nonatomic, retain) UITableView *table2;

@end

@implementation MyController

@synthesize table1 = _table1,
            table2 = _table2;

- (void)viewDidLoad {
    [super viewDidLoad];
    CGRect table1Rect = CGRectMake(0, 0, 200, 300);
    UITableView *table1 = [[UITableView alloc] initWithFrame:table1Rect style:UITableViewStyleGrouped];
    table1.delegate = self;
    table1.dataSource = self;
    [self.view addSubview:table1];
    self.table1 = table1;
    [table1 release];

    CGRect table2Rect = CGRectMake(200, 0, 200, 300);
    UITableView *table2 = [[UITableView alloc] initWithFrame:table2Rect style:UITableViewStyleGrouped];
    table2.delegate = self;
    table2.dataSource = self;
    [self.view addSubview:table2];
    self.table2 = table2;
    [table2 release];
}

- (void)viewDidUnload {
    self.table1 = nil;
    self.table2 = nil;
}

- (void)dealloc {
    self.table1 = nil;
    self.table2 = nil;
    [super dealloc];
}

@end

答案 3 :(得分:0)

如果您正在放置,请在viewController中说出2个表,并在同一个类中找到您的委托和数据源方法,然后将标记设置为tableView或向其添加出口以及委托和数据源的每个函数,您可以相应地编码作为调用者参考可以在每个方法中找到(您可以将它们视为(UITableView *)tableView):

if(tableView == table1)或if(tableView.tag == 1) { } 其他 { }

2)创建单独的NSObject类(比如TableClassSource)并使用UITableViewDelegate和UITableViewDataSource进行设置,并在此处进行所有编码。并在您的ViewController中创建此类的Object,并将表的委托和数据源设置为此对象

TableClassSource * obj = [[TableClassSource alloc] init]; table1.dataSource = OBJ; table1.delegate = OBJ;

您可以在TableClassSource中创建一个方法,如loadMethod,如果每次需要更新表,都可以调用此方法进行重新加载

或者您可以从

中查看和下载示例项目以获取更多详细信息

Handling more than 1 table in a single View- Part-1

Handling more than 1 table in a single View- Part-2