在iPhone Mail应用程序上重新创建蓝色“未读点”的功能

时间:2009-12-12 04:57:22

标签: iphone objective-c cocoa-touch uitableview uinavigationcontroller

我正在构建一个带有非常类似于内置邮件应用程序的GUI的RSS阅读器。它使用Core Data在下载后存储信息。下载故事时,它有一个蓝点表示它是新的。一旦我读完一个故事后回到主页,这个点就应该消失了。它一直呆在那里,直到我滚动或重新启动应用程序。在viewWillAppear:方法中,我调用[self.tableView reloadData];成功调用所有可见单元格的cellForRowAtIndexPath:。这是我的cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
static NSString *CellIdentifier = @"StoryCellIdentifier";
StoryCell *cell = (StoryCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[NSBundle mainBundle] loadNibNamed:@"StoryCell" owner:self options:nil] objectAtIndex:0];
}

NSUInteger thisRow = [indexPath row];
NSManagedObject *managedObject = [storyData objectAtIndex:thisRow];

cell.titleLabel.text = [[managedObject valueForKey:@"title"] description];
cell.descLabel.text = [[managedObject valueForKey:@"subTitle"] description];
if (!([managedObject valueForKey:@"new"]))
{
    cell.readIndicator.image = nil;
}

return cell;
}

该程序应该按cell.readIndicator.image = nil;行。事实上,当点和不存在时,程序遵循相同的执行路径。此外,这可能是相关的,但当我点击导航控制器时,我点击的单元格仍然会突出显示。

编辑:与.xib对应的.m文件只是样板文件。

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier 
{
    if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) 
    { }
    return self; 
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
 {
     [super setSelected:selected animated:animated]; 
 }

EDIT2:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath     *)indexPath
{
    StoryView *storyView = [[StoryView alloc] initWithNibName:@"StoryView" bundle:nil];
    NewsItem *item = [storyData objectAtIndex:[indexPath row]];

    [storyView viewLoaded:item];

// Pass the selected object to the new view controller.
// ...
    item.new = NO;
    [managedObjectContext save:nil];
    [self.navigationController pushViewController:storyView animated:YES];

    [storyView release];
}  

3 个答案:

答案 0 :(得分:1)

可能是一个单独的错误的一件事是,如果具有已读取项目的单元格被重新用于显示未读取项目,则您的单元格将显示错误...您需要执行类似

if (!([managedObject valueForKey:@"new"]))
{
    cell.readIndicator.image = nil;
}
else
{
    cell.readIndicator.image = blueDotImage;
}

而不是假设在创建单元格时将蓝点图像放在那里。

对于非显示部分,我想知道你是否需要调用setNeedsDisplay - 当你更改readIndicator的图像时,单元格可能没有意识到它需要重新绘制

答案 1 :(得分:0)

对于弹出VC时突出显示的单元格,请参阅this

对于主要问题,也许您应该发布自定义表格单元格代码的相关部分供我们查看。

答案 2 :(得分:0)

你的viewWillAppear方法被解雇了吗?尝试将[table reloadData]语句添加到didSelectRowAtIndexPath方法,看看是否有效。

我遇到了viewWillAppear方法并不总是被调用的问题。结帐this thread了解详情。