0

次のように読み取る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";
    }
)

テーブルセルにそれぞれの名前と価格が入力されていない理由はありますか?

4

3 に答える 3

2

これは、このような長いネストされたメソッド呼び出しを1行に含めるべきではない理由の良い例です。あなたのライン:

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あなたがそれを持っている方法で、あなたは鍵のデータを取得するのを忘れました。

私が行ったように行を分割することには多くの利点があります。セルごとに、セクションデータ、行データ、および行データを複数回検索する必要はありません。したがって、これははるかに効率的です。コードを分割すると、デバッグがはるかに簡単になり、読みやすくなります。

于 2013-03-26T15:25:19.830 に答える
1
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"];
于 2013-03-26T14:49:09.063 に答える
1

「行」と呼ばれるキーを参照できませんでした。考えられる解決策は次のとおりです。

- (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;
}
于 2013-03-26T14:49:33.380 に答える