显示之前是否已单击tableview单元格?

时间:2014-03-15 12:03:23

标签: ios objective-c ios7 parse-platform

我正在使用新闻Feed开发应用。

这是来自parse.com的PFQueryTableView加载内容。

我还有一个附有segue的详细信息ViewController

我的问题是:

如何显示之前没有点击的单元格?

就像IOS中的Mail应用程序一样。

这是一张图片:

http://i.stack.imgur.com/vO2N3.png

- (id)initWithCoder:(NSCoder *)aCoder
{
self = [super initWithCoder:aCoder];
if (self) {
    // Custom the table

    // The className to query on
    self.parseClassName = @"Nyhet";

    // The key of the PFObject to display in the label of the default cell style
    self.textKey = @"Rubrik";

    // Whether the built-in pull-to-refresh is enabled
    self.pullToRefreshEnabled = YES;

    // Whether the built-in pagination is enabled
    self.paginationEnabled = YES;

    // The number of objects to show per page
    self.objectsPerPage = 10;
}
return self;
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleDefault;
}


- (void)viewDidLoad
{
[super viewDidLoad];

// Change button color
sidebarButton.tintColor = [UIColor whiteColor];

// Set the side bar button action. When it's tapped, it'll show up the sidebar.
sidebarButton.target = self.revealViewController;
sidebarButton.action = @selector(revealToggle:);


// Set the gesture
[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];

}


- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (PFQuery *)queryForTable
{
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];

// If no objects are loaded in memory, we look to the cache first to fill the table
// and then subsequently do a query against the network.
/*    if ([self.objects count] == 0) {
    query.cachePolicy = kPFCachePolicyCacheThenNetwork;
}*/

[query orderByDescending:@"Prioritering"];

return query;
}



// Override to customize the look of a cell representing an object. The default is to display
// a UITableViewCellStyleDefault style cell with the label being the first key in the object.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{
static NSString *simpleTableIdentifier = @"RecipeCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}

UILabel *nameLabel = (UILabel*) [cell viewWithTag:101];
nameLabel.text = [object objectForKey:@"Rubrik"];

UILabel *prepTimeLabel = (UILabel*) [cell viewWithTag:102];
prepTimeLabel.text = [object objectForKey:@"Detaljer"];



return cell;
}

- (void) objectsDidLoad:(NSError *)error
{
[super objectsDidLoad:error];

NSLog(@"error: %@", [error localizedDescription]);
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"showRecipeDetail"]) {
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    RecipeDetailViewController *destViewController = segue.destinationViewController;

    PFObject *object = [self.objects objectAtIndex:indexPath.row];
    Recipe *recipe = [[Recipe alloc] init];
    recipe.name = [object objectForKey:@"Rubrik"];
    recipe.prepTime = [object objectForKey:@"Text"];
    recipe.detaljer = [object objectForKey:@"Detaljer"];
    recipe.rubriker = [object objectForKey:@"Rubrik"];
    destViewController.recipe = recipe;

}
}


@end

4 个答案:

答案 0 :(得分:0)

我想到了两种解决方案。

  • 更简单的解决方案是使用NSMutableArray来保存所有访问过的单元格。在didSelectRowAtIndexPath:执行此操作:

    if (![visitedCellsArray containsObject:[NSNumber numberWithInt:indexPath.row]])
        [visitedCellsArray addObject:[NSNumber numberWithInt:indexPath.row]];
    

然后在backgroundColor

中为您的单元格设置一个cellForRowAtIndexPath:(只是一个建议,您可以使用任何UI指示符 - 点,颜色等)
  • 其次,可能不利于你的目的。我真的不知道你使用的字典是否可变,以及添加密钥是否会对你的控制流产生任何影响。但是,如果可以添加密钥,请添加@“see”之类的密钥,并在[NSNumber numberWithBool:YES]中使用didSelectRowAtIndexPath:进行设置,并在cellForRowAtIndexPath:中根据此密钥的值添加适当的UI指示。这种方法记忆力更好。

答案 1 :(得分:0)

我认为最好使用自定义UITableViewCell示例:

CustomTableViewCell.h
@interface CustomTableViewCell : UITableViewCell

@property(assign) bool beforeClicked

@end

CustomTableViewCell.m
#import CustomTableViewCell.h

@implementation CustomTableViewCell
@synthesize beforeClicked;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

@end

而且,例如:

CustomTableViewCell.h //add this header
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{
    static NSString *simpleTableIdentifier = @"RecipeCell";

    CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil) {
         cell = (CustomTableViewCell *)[[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

    UILabel *nameLabel = (UILabel*) [cell viewWithTag:101];
    nameLabel.text = [object objectForKey:@"Rubrik"];

    UILabel *prepTimeLabel = (UILabel*) [cell viewWithTag:102];
    prepTimeLabel.text = [object objectForKey:@"Detaljer"];

    cell.beforeClicked = NO;

    return cell;
}



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
{
    UITableViewCell *myCell = [tableView cellForRowAtIndexPath:indexPath];

    myCell.beforeClicked = YES;
}

答案 2 :(得分:0)

我给你的PFReceipt对象一个属性BOOL new。

然后只需获取并设置该属性,然后在cellForRow中根据属性的值设置字体。

干净甚至持久。

...

重申:

  1. 修改PFReceipt对象以使其具有属性new
  2. 修改- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object

    ...
    cell.clickedBefore = !receipe.new; 
    
  3. 将recipes标记为在显示时不再是新的

    ...
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
       if ([segue.identifier isEqualToString:@"showRecipeDetail"]) {
           ...
           PFObject *object = [self.objects objectAtIndex:indexPath.row]; 
           selectedCell.clickedBefore = !object.new;
    

答案 3 :(得分:0)

所提供的解决方案都没有考虑到该应用可能有多个用户。如果您存储"阅读"或"新"对象中的属性,只有在ANYBODY读取它时才会显示。因此,如果Jane读到它,Mark会将其视为已阅读。

要为所有用户单独处理此问题,您需要另一个解析类来处理读取状态。这实现起来有点复杂,但它是在服务器上解决所有问题的唯一方法。

另一种选择是在每个客户端上存储读取状态列表。这意味着某种本地持久性存储,它知道读取的配方,并将其与从Parse获取的数据进行比较。