iOS - Как да покажа данни от plist, когато има повече от един ключ?

Мога да получа данни от plist, но изглежда, че моят cellForRowAtIndexPath не се извиква, тъй като никой от NSLog не отпечатва нищо от вътрешността на метода.

ето моят код: -

- (void)viewDidLoad
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"drinks" ofType:@"plist"];

    NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
    self.drinks = [tempDict objectForKey:@"Root"];
    NSLog(@"%@", self.drinks);
    NSLog(@"Number = %d", self.drinks.count);    
    [super viewDidLoad];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
NSLog(@"I am inside cellForRowAtIndexPath");
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell.
NSArray *allValues = [self.drinks valueForKey:@"name"];    
NSLog(@"%d", allValues.count);
cell.textLabel.text = [allValues objectAtIndex:indexPath.row];

return cell;

}

Ето изхода ми от конзолата: -

2011-10-01 20:27:01.940 DrinkMixer[1832:b303] (
        {
        directions = "Shake adahsdk adlkasd";
        ingredients = "kslkds lkjsjlkd kjsljlakj aajdlkj";
        name = "Fire Cracker";
    },
        {
        directions = "abds fedfsdkkjkljlkj;j ok";
        ingredients = "hasdhalsdlash asdhasldh kjdfkjshdj";
        name = "Lemon Drop";
    },
        {
        directions = "abds fedfsdkkjkljlkj;j ok";
        ingredients = "hasdhalsdlash asdhasldh kjdfkjshdj";
        name = Mojito;
    },
        {
        directions = "abds fedfsdkkjkljlkj;j ok";
        ingredients = "hasdhalsdlash asdhasldh kjdfkjshdj";
        name = "After Drink Mint";
    },
        {
        directions = "abds fedfsdkkjkljlkj;j ok";
        ingredients = "hasdhalsdlash asdhasldh kjdfkjshdj";
        name = "Apple Martini";
    },
        {
        directions = "abds fedfsdkkjkljlkj;j ok";
        ingredients = "hasdhalsdlash asdhasldh kjdfkjshdj";
        name = "Shockwave";
    },
        {
        directions = "abds fedfsdkkjkljlkj;j ok";
        ingredients = "hasdhalsdlash asdhasldh kjdfkjshdj";
        name = "Beer";
    },
        {
        directions = "abds fedfsdkkjkljlkj;j ok";
        ingredients = "hasdhalsdlash asdhasldh kjdfkjshdj";
        name = "Last Desire";
    },
        {
        directions = "abds fedfsdkkjkljlkj;j ok";
        ingredients = "hasdhalsdlash asdhasldh kjdfkjshdj";
        name = "Vodka";
    }
)
2011-10-01 20:27:01.942 DrinkMixer[1832:b303] Number = 9

Нито един NSLog на cellForRowAtIndexPath не се извиква.

Може ли някой да каже какво не е наред с този код.

Благодаря.


person Varundroid    schedule 01.10.2011    source източник
comment
Няма нищо лошо в този код, така че грешката ви трябва да е някъде другаде. Извиква ли се някой от вашите методи на tableView? Колко реда се връщат, например?   -  person Jamie    schedule 01.10.2011
comment
Реших проблема. Направих много глупава грешка. Връщах грешна стойност от метода numberOfRowsInSection. Благодаря, че се опитахте да ми помогнете. Аз наистина го оценявам.   -  person Varundroid    schedule 01.10.2011


Отговори (1)


Вероятностите са, че или не сте внедрили UITableViewDelegate във вашия заглавен файл, или вашите UITableView datasource и delegate не са свързани във вашия nib файл.

Предлагам да разгледате datasource.

АКТУАЛИЗАЦИЯ:

Фактът, че tableView:cellForRowAtIndexPath: не се извиква и datasource е зададен правилно, тогава може да се окаже, че plist е зареден в self.drinks, след като UITableView вече е зареден. Доказателството може да бъде да превъртите празното UITableView нагоре и надолу и да видите дали клетки извън екрана започват да се появяват.

Предлагам две неща:

  1. обадете се на [super viewDidLoad]; в началото на вашия -(void)viewDidLoad

  2. повикване за презареждане на вашия UITableView, след като plist бъде зареден.

Опитвам:

- (void)viewDidLoad {

    [super viewDidLoad];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"drinks" ofType:@"plist"];

    NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
    self.drinks = [tempDict objectForKey:@"Root"];
    NSLog(@"%@", self.drinks);
    NSLog(@"Number = %d", self.drinks.count);    

    [yourTableView reload];

}

И накрая, причината да се тревожа за вашето datasource е, че смятам, че дори празна клетка трябва да извика tableView:cellForRowAtIndexPath:

Надявам се това да помогне.

person dredful    schedule 01.10.2011
comment
всичко е на правилното място. Този код работеше преди, но направих няколко промени в моя plist и след това просто спря да работи, въпреки че все още мога да извличам данни от plist, както можете да видите следата на конзолата. Нямам представа какво правя грешно. - person Varundroid; 01.10.2011
comment
Най-накрая реших проблема. Каква глупава грешка. Проклет да съм!! Връщах грешна стойност от numberOfRowsInSection. Благодаря, че се опитахте да ми помогнете. Аз наистина го оценявам. - person Varundroid; 01.10.2011
comment
Готино. Радвам се, че си разбрал. - person dredful; 01.10.2011