0

我正在编写一个 Master/Detail CoreData RSS 阅读器,以获得乐趣。

我使用以下实体: Category 1->n Feed 0->n Post

所以在我的 UISplitView 的左窗格中,有按类别分组的提要。选择一个 Feed 将获取,然后在右侧窗格中显示其帖子。

右侧窗格还包含一个 UITableView,它使用 2 种原型单元格: readunread.

read并且unread取决于(NSDate *)read相应PostManagedObject 的属性:如果是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 窗格推送到右侧窗格的 segue。此 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 并返回到 Feed 列表时,已录制的 Post 单元格和以下所有单元格现在都作为read第一次显示。第二次,UITableView 中的所有单元格显示为read

谁能告诉我我在这里做错了什么?我只想将选定的对象标记为已读...

在此先感谢您的帮助。

编辑:

它可能来自didSelectRowAtIndexPath方法中的这一行吗?

post.read = [NSDate date];

我应该将其替换为:

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

我仍然对点符号与setValue...

编辑2:

不 :( 刚做了测试。

4

1 回答 1

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;
    }

- (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变量正在影响其他行...

于 2013-07-14T16:57:09.350 回答