2015-04-22 134 views
0

我在開發tableview自定義單元格時經常遇到這個問題。我有一個tableview,它有很多自定義的單元格(一個UIImageView和UILabel)當用戶點擊任何這個單元格推新UIViewController和用戶填充一些數據,並點擊「保存」viewcontroller推回委託方式。UITableview單元格保留自定義圖像視圖過濾器

在此代理方法中,我檢查點擊單元格並更改該色調顏色(如選定狀態,但我只更改自定義的ImageView色調顏色)。所以這個改變是正確的,但當我滾動任何垂直方向色調消失。下面的圖片和代碼正確計算出來。

當彈出從委託方法查看控制器(正常工作)

enter image description here

當滾動垂直方向錫

enter image description here

// Custom cell 

@interface CustomCell : UITableViewCell 
@property(strong, nonatomic) UIImageView *imageView; 
@property(strong, nonatomic) UILabel *titleLabel; 
@end 

// Custom Cell implementation nothing special here. 

// UIViewController delegate method when pop back 
// I'm filling specific color 

@interface UIViewController 
@property (strong,nonatomic) CustomCell *myCustomCell; 
@end 

@implementation UIViewController 



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ... 

    _myCustomCell = (CustomCell *)[self.tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath]; 

    ... 
} 

- (void)userTappedBackButton { 
    _myCustomCell.imageView.image = [cell.customImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
    _myCustomCell.imageView.tintColor = [UIColor colorWithRed:0.27 green:0.58 blue:0.98 alpha:1]; 
} 
@end 

回答

0

跟蹤噸的他會在被選中時指定被點擊的單元格的路徑,而不是單元格本身,當您滾動時會重新使用該單元格。在cellForRow應用選擇的風格,當你提出了匹配的「選擇」索引路徑的電池,另外,當您返回到視圖

更新:添加代碼,以澄清

在你自定義單元格,提供簡單的方法來啓用/禁用色彩:

@interface CustomCell : UITableViewCell 

@property(strong, nonatomic) UIImageView *imageView; 
@property(strong, nonatomic) UILabel *titleLabel; 

- (void)enableLastSelectedHighlight; 
- (void)disableLastSelectedHighlight; 

@end 

實現:

@implementation CustomCell 

- (void)prepareForReuse 
{ 
    [super prepareForReuse]; 

    // Reset prior to being reused 
    [self disableLastSelectedHighlight]; 
} 

- (void)enableLastSelectedHighlight 
{ 
    self.imageView.image = [cell.customImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
    self.imageView.tintColor = [UIColor colorWithRed:0.27 green:0.58 blue:0.98 alpha:1]; 
} 

- (void)disableLastSelectedHighlight; 
{ 
    self.imageView.image = [cell.customImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
} 

@end 

在您的TableViewController.m文件中,通過didSelectRowAtIndexPath或您現有的自定義代理userTappedBackButton跟蹤選擇。的實施將是相同的:

@interface MyTableViewController() 

@property (nonatomic, strong) NSIndexPath *lastSelectedCellIndexPath; 

@end 

@implementation MyTableViewController 

// Your existing implementation 
// ... 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Update our reference to the tinted row 
    [self setLastSelectedCellIndexPath:indexPath]; 

    // Un-tint any currently tinted cells 
    [self.tableView.visibleCells makeObjectsPerformSelector:@selector(disableLastSelectedHighlight)]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Get your cell 
    CustomCell *cell = (CustomCell *)[self.tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath]; 
    if (indexPath == self.lastSelectedCellIndexPath) { 
     // This cell should be tinted 
     [cell enableLastSelectedHighlight]; 
    } 
    // The rest of your cell setup... 
} 

@end 
+0

謝謝老兄。這就是我需要的。但另一種方法是所有單元的負載都很低。但有時會造成麻煩。 –

+0

經過一些測試後,我發現這不是一個好的選擇。 –

+0

我很想知道爲什麼,以及你最終得到什麼解決方案 – bdalziel

0

你的問題是,你是保存到UITableViewCell一個參考,但在細胞被重用。

您需要以另一種方式保存有關要突出顯示的單元格的信息,這種方式不會受到正在重用的單元格的影響。我會建議通過使用indexPath

類似下面應該工作:

@property (nonatomic, strong) NSIndexPath *lastSelectedIndexPath; 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ... 

    CustomCell *cell = (CustomCell *)[self.tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath]; 
    if([indexPath isEqual:self.lastSelectedIndexPath]) { 
     cell.imageView.image = [cell.customImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
     cell.imageView.tintColor = [UIColor colorWithRed:0.27 green:0.58 blue:0.98 alpha:1]; 
    } 
    ... 
} 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Save the selected indexPath 
    self.selectedIndexPath = indexPath; 
} 
- (void)userTappedBackButton { 
    // Reload the row that needs to be updated with the new tint color 
    [tableView reloadRowsAtIndexPaths:@[self.selectedIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 

讓我知道,如果它的工作。

+0

我有多個部分,所以我想這個代碼將無法正常工作。 –

+0

您正在保存同時具有分區和行信息的indexPath,因此它將與更多分區一起工作 –

+0

不,它不適用於許多行和分區。 –

相關問題