2013-07-11 2 views
0

Я сейчас пишу читатель Master/Detail CoreData для удовольствия.Основные данные: изменение управляемого объекта распространяется на остальные записи UITableView

Я использую следующие объекты: 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; 
} 

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

- (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 и вернуться к списку потока, записанная на пленку сообщения клетки и все следующие ячейки теперь отображаются как read в первый раз. Во второй раз все ячейки в UITableView показаны как read.

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

Заранее за вашу помощь.

EDIT:

Может исходить от этой линии в методе didSelectRowAtIndexPath?

post.read = [NSDate date]; 

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

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

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

EDIT 2:

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

ответ

0

Решено.

Другие данные не были изменены.Я изменил метод 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; 
    } 

IS

- (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 влиял на другие строки ...

 Смежные вопросы

  • Нет связанных вопросов^_^