Основные данные: изменение управляемого объекта распространяется на остальные записи 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
переменная влияла на другие строки...