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 - UITableViewController 和核心数据行在 tableView 中重复