Основные данные: изменение управляемого объекта распространяется на остальные записи UITableView

Я в процессе написания Master/Detail CoreData RSS Reader для удовольствия.

Я использую следующие лица:Category 1->n Feed 0->n Post

Итак, на левой панели моего UISplitView есть каналы, сгруппированные по категориям. Выбор канала будет загружен, а затем отобразить его сообщения в правой панели.

Правая панель также содержит UITableView, который использует 2 вида прототипов ячеек:read а также unread,

read а также unread зависит от собственности (NSDate *)read соответствующего Post ManagedObject: если это nil, то это будет отображаться с помощью unread прототип клетки.

Вот код для cellForRowAtIndexPath метод:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *feedTableIdentifier = @"unread";
    Post *thepost = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSDate *tmpDate=[NSDate date];
    if (thepost.read) {
        tmpDate=thepost.read;
        feedTableIdentifier = @"read";
    } else if (thepost.date) {
        tmpDate=thepost.date;
    }
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:feedTableIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:feedTableIdentifier];
    }
    ((UILabel *)[cell viewWithTag:1]).text = thepost.title;
    NSDateFormatter *df=[[NSDateFormatter alloc] init];
    df.dateFormat = @"EEEE, MMMM d, YYYY";
    ((UILabel *)[cell viewWithTag:2]).text = [df stringFromDate:tmpDate];
    ((UILabel *)[cell viewWithTag:3]).text = [self flattenHTML:thepost.excerpt];
    return cell;
}

Теперь, когда я выбираю ячейку Post, я следую за ходом, который выдвигает панель WebView на правую панель. Этот WebView показывает содержание соответствующих Post.url стр. В то же время я буду редактировать текущий управляемый объект read свойство, которое я буду устанавливать для текущей NSDate. Затем я сохраню ManagedObjectContext и повторно получу фиды правой панели, чтобы отразить новый формат:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    PostDetailController *webController = [[PostDetailController alloc] init];

    if ([[segue identifier] isEqualToString:@"ShowWebLink"]) {
        webController = [segue destinationViewController];
        webController.urlstr = ((Post *)sender).url;
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Post *post=[self.fetchedResultsController objectAtIndexPath:indexPath];
    [self performSegueWithIdentifier:@"ShowWebLink" sender:post];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    post.read = [NSDate date];
    NSError *error;
    if (![self.managedObjectContext save:&error])
    {
        NSLog(@"[didSelectRowAtIndexPath] Error saving context: %@", error);
    }
    [self refetch];
}

Теперь вот моя проблема: когда я открываю UIWebView и возвращаюсь к списку каналов, записанная на пленку ячейка Post и все последующие ячейки теперь отображаются как read первый раз. Во второй раз все ячейки в UITableView отображаются как read,

Кто-нибудь может сказать мне, что я здесь делаю неправильно? Я бы хотел, чтобы только выбранный объект был помечен как прочитанный...

Заранее спасибо за помощь.

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

Может ли это прийти из этой линии в didSelectRowAtIndexPath метод?

post.read = [NSDate date];

Должен ли я заменить его на:

[post setValue:[NSDate date] forKey:@"read”];

Я все еще смущен точечной нотацией против setValue...

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

Нету:(Только что сделал тест.

1 ответ

Решение

Решаемые.

Другие данные не были изменены. Я изменил cellForRowAtIndexPathМетод следующим образом:

БЫЛО

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *feedTableIdentifier = @"unread";
    Post *thepost = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSDate *tmpDate=[NSDate date];
    if (thepost.read) {
        tmpDate=thepost.read;
        feedTableIdentifier = @"read";
    } else if (thepost.date) {
        tmpDate=thepost.date;
    }

ЯВЛЯЕТСЯ

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *feedTableIdentifier = @"unread";
    Post *thepost = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSDate *tmpDate=[NSDate date];
    if (thepost.read) {
        tmpDate=thepost.read;
        feedTableIdentifier = @"read";
    } else if (thepost.date) {
        tmpDate=thepost.date;
        feedTableIdentifier = @"unread";
    }

staticпеременная влияла на другие строки...

Другие вопросы по тегам