Перезагрузить UITableView - PullRequest
2 голосов
/ 16 мая 2011

У меня есть класс, реализующий UITableViewDelegate и NSXMLParserDelegate.Мое приложение на основе вкладок.Когда я выбираю нужную вкладку, в методе viewWillAppear моего класса я запускаю свой xml-анализатор для анализа RSS-канала по определенному URL, а затем заполняю UITableView содержимым каналов.
Теперь яхочу иметь кнопку, чтобы «обновить» представление (то есть снова проанализировать RSS-канал и отобразить новые результаты).Итак, у меня есть этот метод в качестве действия кнопки обновления:

-(IBAction)refreshFeeds:(id)sender
{
    if (stories){
        [stories release];  // Stories is an NSMutableArray for storing the parsed feeds
        stories = nil;
    }
    [self viewWillAppear:YES];
    NSLog(@"RELOADING!!!!!!!!!!!!!!!");
}

Моя проблема в том, что когда я нажимаю кнопку «обновить», представление становится пустым, как будто нет каналов для отображения.
Если затем я переключаюсь на другую вкладку и затем возвращаюсь, представление таблицы снова заполняется каналами.
Что я делаю не так?Заранее спасибо.

(Вот часть того, как я реализовал класс)

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if ([stories count] == 0){
        NSString * path = @"http://www.theRssUrl.com";
        [self parseXMLFileAtURL:path];
    }
}
//custom method to parse rss xml
- (void)parseXMLFileAtURL:(NSString *)URL {

    if (stories) {
        [stories release];
        stories = nil;
    }
    stories = [[NSMutableArray alloc] init];
    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];
    //you must then convert the path to a proper NSURL or it won't work
    NSURL *xmlURL = [NSURL URLWithString:URL];

    rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
    [rssParser setDelegate:self];

    [rssParser parse];
}
- (void)parserDidEndDocument:(NSXMLParser *)parser { 

    [newsTable reloadData]; //newsTable is the UITableView i want to refresh
    self.view = newsTable;
    [rssParser release];
    rssParser = nil;
}

РЕДАКТИРОВАТЬ:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   // Configure the cell.
   static NSString *MyIdentifier = @"MyIdentifier";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    if (cell == nil){
        cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    }

    int storyIndex = indexPath.row;

    cell.lTitle.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
    cell.lSummary.text = [[stories objectAtIndex: storyIndex] objectForKey: @"summary"];

    return cell;
}

Ответы [ 3 ]

1 голос
/ 16 мая 2011

Вы можете вызвать [self parseXMLFileAtURL:path]; напрямую, чтобы обновить ваш канал, так как этот метод очищает массив. Не вызывайте viewWillAppear напрямую. Просто вызовите parseXMLFileAtURL в viewWillAppear и refreshFeeds.

0 голосов
/ 16 мая 2011

Как я понимаю ваш код, stories - это массив, который предоставляет данные для newsTable. Вы обнуляете его и обновляете массив. Что если newsTable запрашивает данные из своего источника данных между ними. Он обнаружит, что stories будет пустым и, следовательно, не будет данных для отображения. Мы можем предположить, что будет небольшая, но значительная задержка при загрузке и анализе ваших rss-данных. В течение этого времени stories будет оставаться пустым.

Вам следует подумать о загрузке данных rss и разборе их в другом массиве. Замените stories как раз перед тем, как вы будете готовы обновить newsTable.

0 голосов
/ 16 мая 2011

Вызов viewWillAppear explicity неверен. Вы должны иметь логику перезагрузки в отдельной функции, вызывать эту функцию в viewWillAppear и при нажатии кнопки. Вызов функции viewWillAppear при нажатии кнопки - это то, что я не считаю правильным.

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