Я сейчас пишу читатель 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:
Нету :( Только что сделал тест.