2013-03-26 2 views
0

У меня есть файл Plist, который считывает следующим образом (исходный вид):секционного UITableView от 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"; 
    } 
) 

Любая идея, почему tablecells не заполняются с соответствующими названиями и ценами?

+0

Вы проверили, 1. делегированы вызовы. 2. все делегаты печатают правильные значения? –

ответ

2

Это отличный пример того, почему вы не должны иметь такие длинные вложенные вызовы методов в одной строке. Ваша линия:

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.

Разделение линий, как и у меня, имеет много преимуществ. Для каждой ячейки нет причин для поиска данных раздела, данных строк и данных строки более одного раза. Так что это намного эффективнее. Разделение кода также облегчает его отладку, а также делает его намного проще для чтения.

+0

Большое вам спасибо. Я должен согласиться с вами - это гораздо легче читать, особенно для меня, исходя из C# и java – catu

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"]; 
+0

Спасибо. Прекрасно работает, но пошел с предложением maddy, так как мне легче читать – catu

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; 
} 
+0

Спасибо. Прекрасно работает, но пошел с предложением maddy, так как мне легче читать – catu

Смежные вопросы