[英]Sectioned UITableview from plist
我有一个plist文件,其内容如下(源代码视图):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>Title</key>
<string> Food</string>
<key>Rows</key>
<array>
<dict>
<key>name</key>
<string>Chunky Chips</string>
<key>price</key>
<string>25,-</string>
</dict>
<dict>
<key>name</key>
<string>Chunky Chips w/ Cheese</string>
<key>price</key>
<string>29,-</string>
</dict>
<dict>
<key>name</key>
<string>Fish'n'Chips</string>
<key>price</key>
<string>89,-</string>
</dict>
</array>
</dict>
<dict>
<key>Title</key>
<string>Snacks</string>
<key>Rows</key>
<array>
<dict>
<key>name</key>
<string>Crisps</string>
<key>price</key>
<string>15,-</string>
</dict>
<dict>
<key>name</key>
<string>Hot Nuts</string>
<key>price</key>
<string>20,-</string>
</dict>
<dict>
<key>name</key>
<string>Popcorn</string>
<key>price</key>
<string>25,-</string>
</dict>
</array>
</dict>
<dict>
<key>Title</key>
<string>Draught Beer</string>
<key>Rows</key>
<array>
<dict>
<key>name</key>
<string>The Ale</string>
<key>price</key>
<string>47,-</string>
</dict>
<dict>
<key>name</key>
<string>Carlsberg</string>
<key>price</key>
<string>47,-</string>
</dict>
<dict>
<key>name</key>
<string>Kilkenny</string>
<key>price</key>
<string>47,-</string>
</dict>
</array>
</dict>
</array>
</plist>
我的TableViewController:
#import "MenuViewController.h"
@interface MenuViewController ()
@property (copy, nonatomic) NSArray* tableData;
@end
@implementation MenuViewController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableData = [NSArray arrayWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"TestList" ofType: @"plist"]];
NSLog(@"%@",_tableData);
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:(BOOL)animated];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [_tableData count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
//return [[[_tableData objectAtIndex: section] objectForKey: @"Rows"] count];
NSDictionary *dataInSection = [[_tableData objectAtIndex: section] objectForKey: @"Rows"];
return [dataInSection count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [[_tableData objectAtIndex: section] objectForKey: @"Title"];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MenuCell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = [[[_tableData objectAtIndex: indexPath.section] objectForKey: @"name"] objectAtIndex: indexPath.row];
cell.detailTextLabel.text = [[[_tableData objectAtIndex:indexPath.section] objectForKey:@"price"]objectAtIndex: indexPath.row];
return cell;
}
我想用部分显示表。 节标题确实会出现,但是没有内容。 我从nslog获得以下信息:
(
{
Rows = (
{
name = "Chunky Chips";
price = "25,-";
},
{
name = "Chunky Chips w/ Cheese";
price = "29,-";
},
{
name = "Fish'n'Chips";
price = "89,-";
}
);
Title = " Food";
},
{
Rows = (
{
name = Crisps;
price = "15,-";
},
{
name = "Hot Nuts";
price = "20,-";
},
{
name = Popcorn;
price = "25,-";
}
);
Title = Snacks;
},
{
Rows = (
{
name = "The Ale";
price = "47,-";
},
{
name = Carlsberg;
price = "47,-";
},
{
name = Kilkenny;
price = "47,-";
}
);
Title = "Draught Beer";
}
)
知道为什么表格单元格没有填入各自的名称和价格吗?
这是一个很好的例子,说明了为什么不应该在一行上有这么长的嵌套方法调用。 您的电话:
cell.textLabel.text = [[[_tableData objectAtIndex: indexPath.section] objectForKey: @"name"] objectAtIndex: indexPath.row];
应该:
NSDictionary *sectionData = _tableData[indexPath.section];
NSArray *rowsData = sectionData[@"Rows"];
NSDictionary *rowData = rowsData[indexPath.row];
NSString *name = rowData[@"name"];
NSString *price = rowData[@"price"];
cell.textLabel.text = name;
cell.detailTextLabel.text = price;
有了它,您就忘了获取Rows
键的数据。
像我一样分界线有很多好处。 对于每个单元格,没有理由不必多次查找分区数据,行数据和行数据。 因此,这效率更高。 拆分代码还使调试变得更加容易,并且使阅读也更加容易。
cell.textLabel.text = [[[_tableData objectAtIndex: indexPath.section] objectForKey: @"name"] objectAtIndex: indexPath.row];
cell.detailTextLabel.text = [[[_tableData objectAtIndex:indexPath.section] objectForKey:@"price"]objectAtIndex: indexPath.row];
应该是(可以自由使用文字)
cell.textLabel.text = _tableData[indexPath.section][@"Rows"][indexPath.row]@"name"];
cell.detailTextLabel.text = _tableData[indexPath.section][@"Rows"][indexPath.row][@"price"];
您错过了引用称为“行”的键的情况。 这是一个可能的解决方案:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MenuCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
}
NSDictionary *product = [[[_tableData objectAtIndex:indexPath.section] objectForKey:@"Rows"] objectAtIndex:indexPath.row];
cell.textLabel.text = [product objectForKey:@"name"];
cell.detailTextLabel.text = [product objectForKey:@"price"];
return cell;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.