为什么我的UITableViewCell不会取消选择并更新其文本?

时间:2011-01-04 16:44:18

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

我有一个带有故事列表的UITableView,底部有一个加载更多故事的单元格。我试图让“更多故事...”单元格取消选择,并在单击时将其文本更改为“正在加载...”。我已经搜索了整个互联网和遍布stackoverflow,我无法弄清楚为什么我的代码不能正常工作。现在,当点击“更多故事...”单元格时,它会保持选中状态并且不会更改其文本。

对于那些要求,更多故事在表格视图的底部添加了25个新故事。

原始代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic
int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
if (storyIndex == [stories count]) {
    UITableViewCell *moreCell = [tableView dequeueReusableCellWithIdentifier:@"more"];
    if (moreCell == nil) {
        moreCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"more"] autorelease];
    } // Set up the cell
    moreCell.textLabel.text = @"Loading...";

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    [self moreStories];
} else { 
    NSLog(@"%@",[[stories objectAtIndex: storyIndex] objectForKey: @"link"]);
    webViewController *webController;
    webController = [[webViewController alloc] initWithURLPassed:[[stories objectAtIndex: storyIndex] objectForKey: @"link"]];
    [self.navigationController pushViewController:webController animated:YES];
    [webController release];
    webController =nil;
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
}
}

已更新,但仍无法正常使用。现在它最终取消选择单元格并将文本更改为“正在加载...”,但只有在更多故事完成下载所有故事之后。显然,我希望在下载故事时文本为“正在加载...” 1/4/10~9pm

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic
int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
if (storyIndex == [stories count]) {
    UITableViewCell *moreCell = [tableView cellForRowAtIndexPath:indexPath];
    moreCell.textLabel.text = @"Loading...";
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    NSArray *arr = [[NSArray alloc] initWithObjects:indexPath,nil];
    [tableView beginUpdates];
    [tableView reloadRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationFade];
    [tableView endUpdates];
    [self moreStories];
} else { 
    NSLog(@"%@",[[stories objectAtIndex: storyIndex] objectForKey: @"link"]);
    webViewController *webController;
    webController = [[webViewController alloc] initWithURLPassed:[[stories objectAtIndex: storyIndex] objectForKey: @"link"]];
    [self.navigationController pushViewController:webController animated:YES];
    [webController release];
    webController =nil;
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
}
}

2 个答案:

答案 0 :(得分:2)

[tableView dequeueReusableCellWithIdentifier:@"more"]告诉表视图为您提供一个不同的单元格,一个位于重用队列中的单元格以及显示的内容。此外,当没有可重复使用的单元格可用于出列时,moreCell == nil条件会生成全新的单元格。此模式仅供表格视图数据源在生成用于显示的表格单元格时使用。

您需要使用[tableView cellForRowAtIndexPath:indexPath]来获取实际选中的单元格。

UITableViewCell *moreCell = [tableView cellForRowAtIndexPath:indexPath];
moreCell.textLabel.text = @"Loading...";

编辑:根据您的更新看起来,正如aBitObvious在评论中所说,网址加载请求阻止了UI的更新。在更新UI时,请尝试启动一个新线程并在该线程中加载数据,以便您的UI可以不受干扰地更新。

答案 1 :(得分:0)

我继续前进,为你想要完成的事情做了一个非常简单的版本。看看这有什么用处。我实现这一目标的方式是我继续改变UITableView的数据源。最终你可能正在做什么来加载更多的故事。要记住的关键是,如果要更改数据源,则需要重新加载tableView。

- (void)viewDidLoad {

  NSArray *array = [[NSArray alloc] initWithObjects:@"Story 1", @"Story 2", @"Story 3", @"Story 4", @"Story 5", @"More Stories", nil];
  self.stories = array;
  [array release];

  [super viewDidLoad];
}

// TableView数据源方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
 {
   return [stories count];
 }

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

  static NSString *CellIdentifier = @"CellIdentifier";
  UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:CellIdentifier]; 
  if (cell == nil) {
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] autorelease];
  }

  cell.textLabel.text = [stories objectAtIndex:[indexPath row]];
  return cell;
 }

// TableView委托方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

if ([indexPath row] == [stories count] - 1) {
    //Get more stories
    [table deselectRowAtIndexPath:indexPath animated:YES];

    NSArray *array = [[NSArray alloc] initWithObjects:@"Story 1*", @"Story 2*", @"Story 3*", @"Story 4*", @"Story 5*", @"Loading...", nil];
    self.stories = array;
    [array release];

    NSArray *arr = [[NSArray alloc] initWithObjects:indexPath,nil];

    [table beginUpdates];
    [table reloadRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationFade];
    [table endUpdates];
}
else {
    //Call your methods to load the stories.
}