简体   繁体   English

从plist截取的UITableview

[英]Sectioned UITableview from plist

I have a plist file that reads as follows (source view): 我有一个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>

My TableViewController: 我的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;
}

I would like to show the table with sections. 我想用部分显示表。 Sectionheaders do show up, but theres no content. 节标题确实会出现,但是没有内容。 I get the following from nslog: 我从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";
    }
)

Any idea why the tablecells aren't populated with the respective names and prices? 知道为什么表格单元格没有填入各自的名称和价格吗?

This is a great example of why you should not have such long nested method calls on a single line. 这是一个很好的例子,说明了为什么不应该在一行上有这么长的嵌套方法调用。 Your line: 您的电话:

cell.textLabel.text = [[[_tableData objectAtIndex: indexPath.section] objectForKey: @"name"] objectAtIndex: indexPath.row];

should be: 应该:

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;

The way you have it, you forgot to get the data for the Rows key. 有了它,您就忘了获取Rows键的数据。

Splitting up the lines as I did has a lot of benefits. 像我一样分界线有很多好处。 For each cell there is no reason to have to lookup the section data, rows data, and the row data more than once. 对于每个单元格,没有理由不必多次查找分区数据,行数据和行数据。 So this is much more efficient. 因此,这效率更高。 Splitting up the code also makes it much easier to debug and also makes it much easier to read. 拆分代码还使调试变得更加容易,并且使阅读也更加容易。

cell.textLabel.text = [[[_tableData objectAtIndex: indexPath.section] objectForKey: @"name"] objectAtIndex: indexPath.row];
cell.detailTextLabel.text = [[[_tableData objectAtIndex:indexPath.section] objectForKey:@"price"]objectAtIndex: indexPath.row];

Should be (took the liberty to use literals) 应该是(可以自由使用文字)

cell.textLabel.text = _tableData[indexPath.section][@"Rows"][indexPath.row]@"name"];
cell.detailTextLabel.text = _tableData[indexPath.section][@"Rows"][indexPath.row][@"price"];

You missed referencing the key called "Rows". 您错过了引用称为“行”的键的情况。 Here's a possible solution: 这是一个可能的解决方案:

- (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM