iPhone TableView 数据分为 2 个部分

Posted

技术标签:

【中文标题】iPhone TableView 数据分为 2 个部分【英文标题】:iPhone TableView Data Into 2 Sections 【发布时间】:2011-03-18 11:37:23 【问题描述】:

我正在尝试获取一个表格视图来将数组中的数据拆分为多个部分...

我对此很陌生,但下面是我的代码 sn-p

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 


    if(section == 0) 
    
        contentArray = [[NSArray arrayWithObjects:@"Send SMS", @"Reports", nil] retain];
    
    if(section == 1) 
    
        contentArray = [[NSArray arrayWithObjects:@"Accounts", nil] retain];
    

    return [contentArray count];

我已成功将数据拆分为 2 个部分,但在填充行时它只是在两个部分中重复第一个内容数组。

谁能帮忙...

谢谢

【问题讨论】:

你能贴出 cellForRowAtIndexPath 的代码 在您的示例代码中,您将有很多内存泄漏。例如,最好在 viewDidLoad 中创建数组。因为您将需要通过几种方法访问数组。请参阅@fluchtpunkt 的答案。 【参考方案1】:

首先,您提供的代码存在漏洞。删除对retain 的两个调用。

其次,您遇到了基于相同信息的多个开关/if..else 链的经典问题。这需要 OO 解决方案。

首先创建一个TableSection类:

@interface TableSection : NSObject
 
@property (nonatomic, copy) NSString* header;
@property (nonatomic, copy) NSArray* rows;

- (NSInteger)numberOfRows;
- (UITableViewCell*)cellInTableView: (UITableView*)tableView forRow: (NSInteger)row;

@end

@implementation TableSection
@synthesize header;
@synthesize rows;
- (void)dealloc 
    [header release];
    [rows release];
    [super dealloc];


- (NSInteger)numberOfRows 
    return rows.count;


- (UITableViewCell*)cellInTableView: (UITableView*)tableView forRow: (NSInteger)row 
    // create/reuse, setup and return a UITableViewCell


@end

现在在您的 TableViewController 中

@interface MyViewController : UITableViewController
 
@property (nonatomic, retain) NSArray* tableSections;

@end

@implementation MyViewController
- (void)dealloc 
    [tableSections release];
    [super dealloc];


- (void)viewDidLoad 
    TableSection* section1 = [[TableSection alloc] init];
    [section1 setRows: [NSArray arrayWithObjects: @"Send SMS", @"Reports", nil]];
    TableSectlion* section2 = [[TableSection alloc] init];
    [section2 setRows: [NSArray arrayWithObjects: @"Accounts", nil]];
    [self setTableSections: [NSArray arrayWithObjects: section1, section2, nil]];
    [section2 release];
    [section1 release];


- (void)viewDidUnload 
    [self setTableSections: nil];


#pragma mark UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView: (UITableView*)tableView 
    return self.tableSections.count;


- (NSInteger)tableView: (UITableView*)tableView numberOfRowsInSection: (NSInteger)section 
    return [[self.tableSections objectAtIndex: section] numberOfRows];



- (UITableViewCell*)tableView: (UITableView*)tableView cellForRowAtIndexPath: (NSIndexPath*)indexPath 
    return [[self.tableSections objectAtIndex: indexPath.section] cellInTableView: tableView forRow: indexPath.row];


- (NSString*)tableView: (UITableView*)tableView titleForHeaderInSection: (NSInteger)section 
    return [[self.tableSections objectAtIndex: section] header];


@end

【讨论】:

【参考方案2】:

不要在 tableview 数据源或委托方法之一中切换(和泄漏)您的内容数据。 tableView:numberOfRowsInSection: 可以被调用任意次数。使用您的代码,您依赖于调用这些方法的特定顺序。

每个部分都应该有一个单独的数组(或一个包含两个部分数组的数组)

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

    if(section == 0) 
        return [section0Array count];
    
    if(section == 1) 
        return [section1Array count];
    
    return 0;


您可以在 viewDidLoad 中创建这些数组:

section0Array = [[NSArray arrayWithObjects:@"Send SMS", @"Reports", nil] retain];
section1Array = [[NSArray arrayWithObjects:@"Accounts", nil] retain];

【讨论】:

【参考方案3】:

我想您应该将代码放在 cellForRowAtIndexPath 中,因为我们通常会在每个部分中添加行数

【讨论】:

【参考方案4】:

您需要确保 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法也根据您对内容数组的拆分返回正确的单元格。您可以在方法中进行类似的检查,例如

switch(indexPath.section) 
 
     case 0:  //First Section 
     switch(indexPath.row) 
     
         case 0: //Setup the cell Send SMS
             break;
         case 1: //Setup the cell Reports
             break;
     

【讨论】:

以上是关于iPhone TableView 数据分为 2 个部分的主要内容,如果未能解决你的问题,请参考以下文章

如何创建类似于 iphone 铃声设置的 tableview?

iphone SDK - 如何连接 2 控制器?

如何将数据添加到 iPhone 上的 TableView?

iPhone - UITableViewController 和核心数据行在 tableView 中重复

数据持久化tableView问题iPhone(读写plist)

iPhone TableView 不填充 JSON 数据