2013-12-12 1 views
1

У меня есть это arquivo.plist ниже.
Я посмотрел документацию Apple, но я не мог найти, как сделать просмотр списка, и я надеюсь, что кто-то может мне помочь.Как я могу отобразить несколько параметров одного и того же ключа из файла .plist в Objective-c?


В первом UITableView, составляет список имен, присутствующих в arquivo.plist, используя следующий код и загружающих следующий метод ниже.

Что я пытаюсь сделать: когда пользователь нажимает на имя tableView, его переводят на второй экран с новым tableView, который отобразит «рамки» этого пользователя.

Проблема в том, что код, который я использую для выбора «фреймов», - это тот же код, который я использую для перечисления имен на первом экране, но он не работает, потому что у каждого пользователя есть только одно имя , но он имеет несколько «фреймов».
Когда я пытаюсь реализовать это, я могу даже собрать массив с «рамками» и передать с помощью segue (я покажу массив с NSLog), но этот массив не может быть отображен как tableView для ошибки, которая Xcode дает мне:

* Нагрузочному приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: '- [__ длина NSCFDictionary]: непризнанного селектор послал к экземпляру 0x8b87a60'

код из кулак (ViewController.m) находится ниже contatos.plist

Надеюсь, вы понимаете, что я пытаюсь сделать и принести мне свет! Спасибо всем!

скриншот .plist файла ниже:

http://img268.imageshack.us/img268/7356/jl26.png

Для справки и для вас, чтобы лучше понять проблему, когда пользователь нажимает на имя таблицы, массив генерируется с «FRAMS «этот пациент (у пациентов в среднем по 3 кадра каждый). Массив NSLog, что он должен быть передан на другую страницу и согласуется новая таблица генерирует следующий текст:

12/12/2013 16:10:13.513 rer [24251:70 b] (
{ 
    1 = 11; 
    2 = 12; 
    3 = 13; 
} 

Я думаю, что это где проблема, так как этот метод массива не может быть реализована в TableView, так что я смотрю на свет лучшего способа установить этот массив и выберите FRAMS, когда я нажимаю пациент

так вот мой ViewController.m:

#import "ViewController.h" 
#import "Contato.h" 
#import "perfilViewController.h" 

@interface ViewController() 
-(void) loadContacts; 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self loadContacts]; 
} 

-(void) loadContacts 
{ 
    NSString *plistCaminho = [[NSBundle mainBundle] pathForResource:@"contatos" 
                  ofType:@"plist"]; 
    NSDictionary *pl = [NSDictionary dictionaryWithContentsOfFile:plistCaminho]; 
    NSArray *dados = [pl valueForKey:@"contatos"]; 

    contatos = [[NSMutableArray alloc] init]; 

    for (NSDictionary *item in dados) { 
     NSString *nome = [item valueForKey:@"nome"]; 
     NSString *telefone = [item valueForKey:@"telefone"]; 
     NSString *fram = [item valueForKey:@"fram"]; 

     Contato *c = [[Contato alloc] initWithNome:nome andTelefone:telefone andFram:fram]; 
     [contatos addObject:c]; 
    } 
} 

#pragma mark UITableViewDataSource 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return contatos.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CelulaContatoCacheID = @"CelulaContatoCacheID"; 
    UITableViewCell *cell = [self.tabelaContatos dequeueReusableCellWithIdentifier:CelulaContatoCacheID]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier:CelulaContatoCacheID]; 
    } 
    Contato *contato = [contatos objectAtIndex:indexPath.row]; 
    cell.textLabel.text = contato.nome; 
    return cell; 
} 

#pragma mark - 
#pragma mark UITableViewDelegate 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Contato *contato = [contatos objectAtIndex:indexPath.row]; 
    NSString *msg = [NSString stringWithFormat:@"Fram:%@",contato.fram]; 

    fran = [[NSMutableArray alloc] init]; 
    fran = [NSMutableArray arrayWithObject:contato.telefone]; 

    NSLog(@"finalmente eu consegui essa porra!!!%@", fran); 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Contato" 
                message:msg 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
    [alert show]; 
    [self.tabelaContatos deselectRowAtIndexPath:indexPath animated:YES]; 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"vai"]) { 
     NSIndexPath *indexPath = [self.tabelaContatos indexPathForSelectedRow]; 
     perfilViewController *destViewController = segue.destinationViewController; 
     Contato *contato = [contatos objectAtIndex:indexPath.row]; 

     fran = [[NSMutableArray alloc] init]; 
     fran = [NSMutableArray arrayWithObject:contato.fram]; 
     destViewController.frans = fran; 
     NSLog(@"%@%@", fran, destViewController.frans); 
    } 
} 
@end 

ответ

1

Я бы в первую очередь сделать:

//declare NSDictionary *pl; in the ViewController.h 
pl = [NSDictionary dictionaryWithContentsOfFile:plistCaminho]; 

Тогда для отображения имен, я бы просто использовать словарь как таковой:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [[pl objectForKey:@"contatos"] count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //... 

    //following commented line not needed anymore 
    //Contato *contato = [contatos objectAtIndex:indexPath.row]; 

    cell.textLabel.text = [[[pl objectForKey:@"contatos"] 
           objectAtIndex:indexPath.row] 
           objectForKey:@"nome"]; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //following commented line not needed anymore 
    //Contato *contato = [contatos objectAtIndex:indexPath.row]; 

    //NOTE: fran is a dictionary now 
    //change "fran" declaration in the ViewController.h to 
    //NSDictionary *fran; 
    fran = [[NSDictionary alloc] init]; 
    fran = [[pl objectForKey:@"contatos"] 
       objectAtIndex:indexPath.row]; 

    NSLog(@"finalmente eu consegui essa porra!!!%@", fran); 

    //... 

    //don't deselectRow (the indexPathForSelectedRow will not work correctly later) 
    //[self.tabelaContatos deselectRowAtIndexPath:indexPath animated:YES]; 
} 

затем на -prepareForSegue я бы передать словарь, связанный с выбранной строкой:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"vai"]) { 
     NSIndexPath *indexPath = [self.tabelaContatos indexPathForSelectedRow]; 
     perfilViewController *destViewController = segue.destinationViewController; 

     //following commented line not needed anymore 
     //Contato *contato = [contatos objectAtIndex:indexPath.row]; 

     //NOTE: fran is a dictionary now 
     //change "fran" declaration in the ViewController.h to 
     //NSDictionary *fran; 
     fran = [[NSDictionary alloc] init]; 
     fran = [[[pl objectForKey:@"contatos"] 
        objectAtIndex:indexPath.row] 
        objectForKey:@"fram"]; 

     //NOTE: destViewController.frans should be a dictionary 
     //handle it appropriately 
     destViewController.frans = fran; 
    } 
} 

поэтому в основном, все словарю использование, нет необходимости в Contato *contato вообще.

РЕДАКТИРОВАТЬ: Что касается вашего текущего метода, вам будет лучше воспроизводить ту же структуру.
Как и в:

[массив имен] имеет {словарь с деталями пользователя} имея ключ, который имеет {словарь FRAMS}

+0

Большое вам спасибо за ваш ответ. Я попробовал ваш sugestion, но все ячейки получили имя первого элемента в файле .plist. Почему это?? – user3093398

+1

Я понял! это не indexPath.section. Нам нужно использовать indexPath.row! – user3093398

+0

ЭТО РАБОТАЕТ !!! ВЫ НЕЗАВИСИМОЕ МАНННН !!! – user3093398

0

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

for (NSDictionary *item in dados) { 
    NSString *nome = [item valueForKey:@"nome"]; 
    NSString *telefone = [item valueForKey:@"telefone"]; 
    NSArray *fram = [item valueForKey:@"fram"]; 

    Contato *c = [[Contato alloc] initWithNome:nome andTelefone:telefone andFram:[fram objectAtIndex:index]]; 
    [contatos addObject:c];  
} 

Где index является целой переменной, вам придется решить, как справиться.

PS: немного более вежливым, когда приложение входа вас;)

+0

Caramba @guilherme Нао SABIA Que A gente podia usar esse parâmetro nos arquivos .plist !! Fui olhar agora e realmente pode !! é isso ai, vou fazer a troca e ver se consigo !!! Valeu mesmo pela ajuda! Brasileiros com tudo por aqui !! kkkkk \ o/ – user3093398

+0

Fiz a mudança, trocando para array tanto no .plist quanto no código. realmente, окончательный массив mudou de Fran = (1 = 11, 2 = 12, 3 = 13) para o que eu esperava, Fran = (11, 12, 13), mas mesmo assim continuo recebendo o mesmo erro! – user3093398

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

  • Нет связанных вопросов^_^