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 не связаны в вашем файле пера.

Предлагаю проверить datasource.

ОБНОВЛЕНИЕ:

Тот факт, что tableView:cellForRowAtIndexPath: не вызывается и datasource установлен правильно, возможно, что список загружается в self.drinks после того, как UITableView уже загружен. Доказательством этого может быть прокрутка пустого UITableView вверх и вниз и проверка, начинают ли появляться ячейки за пределами экрана.

Предлагаю две вещи:

  1. позвоните [super viewDidLoad]; в начале -(void)viewDidLoad

  2. вызовите перезагрузку вашего UITableView после загрузки списка.

Пытаться:

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