UITableviewController - 更新特定的单元格

时间:2011-12-12 15:35:55

标签: objective-c uitableview

我创建了一个带有按钮的自定义单元格,该按钮可以将行的状态从“可用”更改为“已购买”,并且我还有一个显示状态的UIImageview。当用户按下按钮时,我希望单元格以新状态重绘。

用户将单元格滚出视图后,我能够重绘UIImage。这就是我到目前为止所做的:

初​​始化

- (void)viewDidLoad
{
  [super viewDidLoad];
  self.clearsSelectionOnViewWillAppear = YES;
  self.contentSizeForViewInPopover = CGSizeMake(600.0, 560.0);
  //[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 
  [self.tableView setRowHeight:60];
  [self.tableView setBackgroundColor:[UIColor blackColor]];
}

只有一个部分:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  // Return the number of sections.
  return 1;
}

所有项目都在“paketListe”数组中:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  // Return the number of rows in the section.
  return [paketListe count];
}

当单元格不在视图中以及最初绘制单元格时,仅调用cellForRow函数。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSLog(@"CellForRow called!");
  PaketTableViewCell *cell = [[[PaketTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil] autorelease];
  [cell setDelegate:self];
  Paket *tempPaket = [paketListe objectAtIndex:[indexPath row]];
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *userDocumentsPath = [paths objectAtIndex:0];
  NSString *fileName = [NSString stringWithFormat:@"%@/%@/%@",userDocumentsPath, [tempPaket productID], [tempPaket previewPic]];
  [cell setProductIndex:[indexPath row]];
  //... Setting some Attributes in my custom cell, cut out for simplicity....
  cell.backgroundColor = [UIColor clearColor];
  return cell;
}

Button的代码,这是一个委托调用,所以我的自定义销售调用[delegate buttonPushed:(int)];

- (void) buttonPushed:(int) myProductIndex {
  NSLog(@"Pushed: %@", [[paketListe objectAtIndex:myProductIndex] productID]);
  CoreDataWrapper *tempCDW = [[CoreDataWrapper alloc] init];
  [tempCDW initCoreData];
  Paket *tempPaket = [paketListe objectAtIndex:myProductIndex];
  //Doing some work in Core Data an my "paketListe" array. Left out for simplicity... 
  [tempCDW release];
  //Here it begins....
  [[self tableView] reloadData];
  [[self tableView] beginUpdates];
  [[self tableView] reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:myProductIndex inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
  [[self tableView] endUpdates];
}

现在我尝试使用不同的命令重新加载...仅使用reloadDatabegin-/endUpdate内容重新加载整个内容。什么都没有刷新细胞。经过几个小时的阅读后,我觉得我做的一切都很正确,但没有刷新。

我感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

又快又脏:

- (void)configureCell:(PaketTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

    //Any cell-specific code

    [cell setNeedsLayout]; //or [cell setNeedsDisplay];
}


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

    //Code to create any/a general cell

    [self configureCell:cell];

    return cell;
}

- (void) buttonPushed:(int) myProductIndex {

    //Code to identify the cell in which your button is (use "super")

    [self configureCell:cellForPushedButton];
}

答案 1 :(得分:0)

我在reloadRowsAtIndexPaths“nil”中了解了你错过的问题。 按照我在下面写的那样,它会起作用。

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForRow:myProductIndex inSection:0], nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];