Как поместить эти данные JSON в мое табличное представление?Пожалуйста, помогите мне, я живу в кошмаре :) - PullRequest
1 голос
/ 15 марта 2011

У меня есть вопрос относительно помещения данных JSON в табличное представление. Я нахожусь в точке, где я успешно проанализировал данные, так как они появляются в моей консоли - но я не могу понять, как поместить эти данные в мое табличное представление. Я потратил целую неделю, пытаясь заставить это работать, пробуя каждую комбинацию вещей под солнцем.

В большинстве случаев это просто сбой, иногда он говорит мне «[NSCFString count]: нераспознанный селектор», что, как я считаю, происходит, потому что я пытаюсь подсчитать строку, которая выдает исключение? - В любом случае, с помощью приведенного ниже кода, он просто печатает данные, которые я хочу, в консоли и показывает нагрузку серых линий в табличном представлении, так что это не дает сбоя (это лучшее, что я могу сделать на данный момент).

Будем весьма благодарны за любую помощь / совет о том, как заполнить таблицу всеми событиями. Мой конечный план для этого представления состоял в том, чтобы в списке было EventNames, которые при выборе выдвигают новый контроллер представления, показывающий данные для этого конкретного события.

Вот вид загруженного метода:

- (void)viewDidLoad {
[super viewDidLoad];

NSURL *url = [NSURL URLWithString:@"http://myurl........."];
NSString *jsonreturn = [[NSString alloc] initWithContentsOfURL:url];

NSLog(jsonreturn); //successfully returns the result of the page

    //to parse it i have made a sbjsonparser object
    SBJsonParser *json = [[SBJsonParser new] autorelease];
    NSError *jsonError;
    NSDictionary *parsedJSON = [json objectWithString:jsonreturn error:&jsonError];

        //if successful, i can have a look inside parsedJSON - its worked as an NSdictionary and NSArray
        NSArray* events = [parsedJSON objectForKey:@"Events"];
        //eventNameList = [parsedJSON objectForKey:@"Events"];
        NSLog(@"show me events: %@", events);
        //NSLog(@"show me events: %@", eventNameList);

            //lets try and get to rows
            //NSEnumerator *enumerator = [events objectEnumerator];
            NSEnumerator *enumerator = [events objectEnumerator];
            NSDictionary* item;
                while (item = (NSDictionary*)[enumerator nextObject]) {
            NSLog(@"event item:eventName = %@", [item objectForKey:@"EventName"]); //everything to this point works and shows in the console

            }

}

А вот код табличного представления:

//customise the number of sections in the table view
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

//customise number of rows
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [eventNameList count];

NSLog(@"here");

}

//customise the appearance of table view cells
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

//try to get a reusable cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

//create a new cell if there is not reusable cell available
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

//set the text display for the cell
NSString *cellValue = [eventNameList objectAtIndex:indexPath.row];

cell.textLabel.text = cellValue;

//NSLog(@"event item from table view:eventName = %@", eventNameList);

return cell;
}

Заранее спасибо, любая помощь или указатели приветствуются и приветствуются :)

Ответы [ 2 ]

3 голосов
/ 15 марта 2011

На вашем месте я бы создал пользовательский объект:

NSEnumerator *enumerator = [events objectEnumerator];
NSDictionary* item;

while (item = (NSDictionary*)[enumerator nextObject]) {
  Event *event = [[Event alloc] init];
  event.eventName = [item objectForKey:@"EventName"];
  // set more properties here
  [eventNameList addObject:event];
  [event release];
}

Тогда вы можете использовать следующее в cellForRowAtIndexPath:

Event *event = (Event *)[eventNameList objectAtIndex:indexPath.row];

cell.textLabel.text = event.eventName;
1 голос
/ 20 марта 2011

Что ж, вы, вероятно, уже решили это, но вы не инициализируете eventNameList в первом блоке кода, вы инициализируете другую переменную с именем events .

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

Кажется, код tableView должен работать, если вы измените

return [eventNameList count];

до

return [events count];

и

[eventNameList objectAtIndex:indexPath.row];

до

[events objectAtIndex:indexPath.row];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...