1

我正在使用最新的 SDK 开发一个 iOS 应用程序。

我有UITableView一个自定义UITableViewCell

@interface FavouriteCell : UITableViewCell

@property (unsafe_unretained, nonatomic) IBOutlet UIImageView *selectIcon;
@property (unsafe_unretained, nonatomic) IBOutlet UILabel *favName;

@property (nonatomic) BOOL checked;

+ (NSString *)reuseIdentifier;

@end

selectIcon我设置两个正常和突出显示的图像。当我这样做cell.checked = !selected;时,tableView:didSelectRowAtIndexPath:它工作得很好。

但是当我尝试重置每个选定的单元格时clearSelectedFavourites:,它不起作用。

@interface FavViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate, UIAlertViewDelegate>
{
@private
    NSMutableArray* _favsSelected;
    BOOL* _isOnEditingMode;
}

// ######### FavViewController implementation ##############

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        self.title = NSLocalizedString(@"Favoritos", @"Favoritos");
        self.tabBarItem.image = [UIImage imageNamed:@"fav"];

        _favsSelected = [[NSMutableArray alloc] init];
        _isOnEditingMode = NO;

    }
    return self;
}

- (UITableViewCell* )tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"cellForRowAtIndexPath");
    static NSString* CellIdentifier = @"FavCell";

    FavouriteCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        [[NSBundle mainBundle] loadNibNamed:@"FavouriteCell" owner:self options:nil];
        cell = _favCell;
        self.favCell = nil;
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.favName.font = [UIFont systemFontOfSize:15.0f];

    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

#pragma mark - UITableViewDelegate methods
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"didSelectRowAtIndexPath: %@", indexPath);

    if (tableView.isEditing)
    {
        BOOL selected = NO;

        if ((_favsSelected != nil) && ([_favsSelected count] > 0))
            selected = ([_favsSelected indexOfObject:indexPath] != NSNotFound);

        FavouriteCell* cell =
            (FavouriteCell*)[tableView cellForRowAtIndexPath:indexPath];

        NSLog(cell.checked ? @"Yes" : @"No");
        cell.checked = !selected;

        if (selected)
            [_favsSelected removeObject:indexPath];
        else
            [_favsSelected addObject:indexPath];
    }
}

- (IBAction)editFavList:(id)sender
{
  NSLog(@"edit button clicked!");
    if ([_favList isEditing])
    {
        [self clearSelectedFavourites];
        [_favList setEditing:NO animated:YES];
        [_editButton setImage:[UIImage imageNamed:@"ButtonEdit.png"] forState:UIControlStateNormal];
    }
    else
    {
        [_favList setEditing:YES animated:YES];
        [_editButton setImage:[UIImage imageNamed:@"done_button.png"] forState:UIControlStateNormal];
    }
}

- (void)clearSelectedFavourites
{
    for(int index = 0; index < [_favsSelected count]; index++)
    {
        NSIndexPath* indexPath = (NSIndexPath*)[_favsSelected objectAtIndex:index];

        FavouriteCell* cell = (FavouriteCell*)[self tableView:_favList cellForRowAtIndexPath:indexPath];
        cell.checked = NO;
    }

    [_favsSelected removeAllObjects];
}

- (void)configureCell:(FavouriteCell *)cell
          atIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *object = nil;

    object = [self.favListFetchedResultsController objectAtIndexPath:indexPath];

    cell.favName.text = [[object valueForKey:@"name"] description];
}

你知道为什么吗?

我试图设置selectIcon为不手动突出显示,但它不起作用,如果我做了最新的测试,那代码。

我也对此进行了测试:[cell setHighlighted:NO];onclearSelectedFavourites:并且它不起作用。

4

2 回答 2

1

您没有向我们展示您的自定义[self configureCell:cell atIndexPath:indexPath];功能,所以我不知道发生了什么。

但是首先有几件事:

TableView 上的单元格正在被重用。因此,您每次都需要为每个单元格设置单元格选择状态。

同样在您的clearSelectedFavourites功能上,您将获得对所有选定单元格的引用,然后清除它们的选择,这是没有意义的,因为这些单元格将被重用。

您只需要遍历可见UITableView单元格并更改它们的选择状态,然后清除您的 _favsSelected 数组...

- (void)clearSelectedFavourites
{

    NSArray *cells = [self.tableView visibleCells];
    for (FavouriteCell *cell in cells)
    {
        cell.checked = NO;
        //might not be needed, or might be needed
        [cell setNeedsDisplay];
    }

    [_favsSelected removeAllObjects];
}

最后,在您的configureCell功能上,您应该根据您的数组条目检查是否应该检查单元格,_favsSelected然后选择它。

编辑

在您的configureCell函数中,您应该检查是否需要检查单元格:

- (void)configureCell:(FavouriteCell *)cell
          atIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *object = nil;

    object = [self.favListFetchedResultsController objectAtIndexPath:indexPath];

    cell.favName.text = [[object valueForKey:@"name"] description];
    cell.checked = [_favsSelected containsObject:indexPath];
}
于 2013-04-02T10:40:29.170 回答
0

你可以这样做:

[tbl beginUpdates];

/* 用动画调用你的方法 */

[tbl endUpdates];

[tbl reloadData];
于 2013-04-02T09:46:10.947 回答