UITableView: NSMutableArray не отображается в таблице - PullRequest
2 голосов
/ 07 апреля 2010

Я новичок в программировании на цель c и iPhone. Кажется, я не могу понять, почему ячейки не будут заполняться при запуске этого кода. Содержимое xml отображается в журнале консоли, а xcode не отображает ошибок. Может ли помочь?

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if(![elementName compare:@"Goal"]) {
        tempElement = [[xmlGoal alloc] init];
    } else if (![elementName compare:@"Title"]) {
        currentAttribute = [NSMutableString string];
    } else if (![elementName compare:@"Progress"]) {
        currentAttribute = [NSMutableString string];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if (![elementName compare:@"Goal"])  {
        [xmlElementObjects addObject:tempElement];
    } else if (![elementName compare:@"Title"]) {
        NSLog(@"The Title of this event is %@", currentAttribute);
        [tempElement setTitled:currentAttribute];
     } else if (![elementName compare:@"Progress"]) {
        NSLog(@"The Progress of this event is %@", currentAttribute);
        [tempElement setProgressed:currentAttribute];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (self.currentAttribute) {
        [self.currentAttribute appendString:string];
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [xmlElementObjects count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [mtableview dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
    // Set up the cell...
    cell.textLabel.text = [xmlElementObjects objectAtIndex:indexPath.row];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {   

}

Ответы [ 5 ]

1 голос
/ 07 апреля 2010

Кажется, я не могу понять, почему ячейки не будут заполняться при запуске этого кода.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [xmlElementObjects count];
}

Этот метод получил удар?Если это так, xmlElementObjects nil?Если нет, возвращает ли он 0, так как в массиве нет элементов?Если так, то это потому, что ваш код синтаксического анализа XML не заполнил массив до его использования?

0 голосов
/ 27 декабря 2010

Ну, xmlElementObjects не массив строк, он содержит экземпляры для какого-то пользовательского класса, который вы создали (я полагаю). Таким образом, когда вы говорите cell.textLabel.text = [xmlElementObjects objectAtIndex:indexPath.row];, вы устанавливаете NSString для какого-то неизвестного объекта.

Попробуйте cell.textLabel.text = [[xmlElementObjects objectAtIndex:indexPath.row] titled];

(я предполагаю название заголовка из кода синтаксического анализа)

0 голосов
/ 07 апреля 2010

Цель C очень нова для меня. Я привык писать PHP, который кажется очень простым по сравнению с этим. Я устанавливаю источник данных, а также изменяю сравнение на isequaltostring. Вот что сейчас пишет консольный журнал:

2010-04-07 02: 28: 16.580 список сегментов [6449: 20b] Название этого события Тест 1 10%

2010-04-07 02: 28: 16.581 список сегментов [6449: 20b] Название этого события Тест 2 20%

2010-04-07 02: 28: 16.584 список [6449: 20b] * - [xmlGoal isEqualToString:]: нераспознанный селектор, отправленный экземпляру 0x3d36600 2010-04-07 02: 28: 16.585 список [6449: 20b] * Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '*** - [xmlGoal isEqualToString:]: нераспознанный селектор, отправленный экземпляру 0x3d36600'

Я ценю всю помощь!

0 голосов
/ 07 апреля 2010

Установите точки останова в -tableView:numberOfRowsInSection: и -tableView:cellForRowAtIndexPath:, чтобы обеспечить их вызов.Как упоминал Альфонс, возможно, что свойство datasource вашего табличного представления не задано.

Некоторые несвязанные заметки:

  1. Почему вы используете выражение ![someString compare:someOtherString] для сравнения?NSString имеет встроенный метод -isEqualToString:, так что вы можете заменить этот оператор на [someString isEqaulToString:someOtherString].Ваши результаты не изменятся, но ваш код получит выгоду от дополнительной читаемости.

  2. В -tableView:cellForRowAtIndexPath: у вас есть следующий код:

    UITableViewCell *cell = [mtableview
                              dequeueReusableCellWithIdentifier:CellIdentifier];
    

    Thisможет вызвать проблемы, если вы продолжаете использовать переменную экземпляра (в данном случае mtableview) здесь.Метод имеет табличное представление в качестве аргумента, поэтому используйте вместо него tableView.Это гарантирует, что вы удалите ячейку из табличного представления, вызвавшего этот метод.

  3. Вы разрабатываете для iPhone OS 3.0 или выше?Если это так, строку

    [[UITableViewCell alloc] initWithFrame:CGRectZero
                           reuseIdentifier:CellIdentifier];
    

    следует заменить на

    [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                           reuseIdentifier:CellIdentifier];
    

    , используя любой стиль ячейки, который вы хотите, естественно.

0 голосов
/ 07 апреля 2010

Еще одна вещь, которую вам нужно проверить: вы установили для свойства dataSource своего табличного представления правильный объект? Кроме этого, проверьте, действительно ли ваш if(![elementName compare:@"Goal"]) действительно «попал» (либо с помощью NSLog (), либо установив там точку останова.

Еще одно примечание, не связанное с этим, вы, вероятно, должны выпустить tempElement после добавления его в словарь xmlElements.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...